Полезные запросы

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Залежнасьці)
 
Строка 1: Строка 1:
Ниже приводится список полезных запросов.
+
Ниже приводится список полезных запросов к таблицам Гедымина. По этой теме, см. также [[Полезные запросы к системным таблицам Firebird]].
  
 
== Документы ==
 
== Документы ==
Строка 67: Строка 67:
 
   UPPER(c.name) LIKE 'ИП%'
 
   UPPER(c.name) LIKE 'ИП%'
 
</pre>
 
</pre>
 
== Запросы к системным таблицам ==
 
 
=== Табліцы БД ===
 
 
RDB$RELATIONS (табліцы)
 
 
Выбраць назвы ўсіх табліц БД (яны захоўваюцца ў табліцы RDB$RELATIONS)
 
 
  select *
 
  from rdb$relations
 
 
Падлічыць колькасьць табліц у БД
 
 
  select count(*)
 
  from rdb$relations
 
 
Выбраць толькі табліцы структуры БД (з прэфіксам RDB)
 
 
  select *
 
  from rdb$relations
 
  where rdb$relation_name like '%RDB%'
 
 
Падлічыць колькасьць табліц структуры БД
 
 
  select count(*)
 
  from rdb$relations
 
  where rdb$relation_name like '%RDB%'
 
 
Выбраць толькі табліцы БД, зьвязаныя са складам (з прэфіксам INV)
 
 
  select *
 
  from rdb$relations
 
  where rdb$relation_name like '%INV%'
 
 
=== Палі табліц ===
 
 
RDB$RELATION_FIELDS (палі)
 
 
Выбраць усе назвы палёў усіх табліц БД (яны захоўваюцца ў табліцы RDB$RELATION_FIELDS)
 
 
  select * from rdb$relation_fields
 
 
Падлічыць колькі палёў уваходзіць у кожную табліцу (групаваць па полю імені табліцы)
 
 
  select rdb$relation_name, count(rdb$field_name) as kolk_palej
 
  from rdb$relation_fields
 
  group by rdb$relation_name
 
 
Выбраць назвы палёў, якія ўваходзяць у табліцу GD_CONTACT
 
 
  select f.*
 
  from rdb$relation_fields f
 
    join rdb$relations r on r.rdb$relation_name = f.rdb$relation_name
 
  where
 
    r.rdb$relation_name = 'GD_CONTACT'
 
 
альбо
 
 
  select *
 
  from rdb$relation_fields
 
  where rdb$relation_name = 'GD_CONTACT'
 
 
Выбраць назвы табліц, якія маюць дрэвавідную структуру
 
 
  select r.rdb$relation_name
 
  from rdb$relation_fields r
 
  where r.rdb$field_name = 'LB'
 
 
==== Список полей с указанием таблиц, на которые ссылаются поля ====
 
 
  SELECT
 
    rf.rdb$field_name AS Field_Name,
 
    rc2.rdb$relation_name AS References_Table,
 
    s2.rdb$field_name AS References_Field,
 
    rf.rdb$field_position
 
  FROM
 
    rdb$relation_fields rf
 
    JOIN rdb$relation_constraints rc ON
 
      rc.rdb$relation_name = rf.rdb$relation_name
 
      AND rc.rdb$constraint_type = 'FOREIGN KEY'
 
    JOIN rdb$index_segments s ON
 
      s.rdb$index_name = rc.rdb$index_name
 
      AND s.rdb$field_name = rf.rdb$field_name
 
    JOIN rdb$ref_constraints rfc ON
 
      rfc.rdb$constraint_name = rc.rdb$constraint_name
 
    JOIN rdb$relation_constraints rc2 ON
 
      rc2.rdb$constraint_name = rfc.rdb$const_name_uq
 
    JOIN rdb$index_segments s2 ON
 
        s2.rdb$index_name = rc2.rdb$index_name
 
  WHERE
 
    rf.rdb$relation_name = :RN
 
 
  UNION
 
 
  SELECT
 
    rf.rdb$field_name AS Field_Name,
 
    CAST(' ' AS CHAR(31)) AS References_Table,
 
    CAST(' ' AS CHAR(31)) AS References_Field,
 
    rf.rdb$field_position
 
  FROM
 
    rdb$relation_fields rf
 
  WHERE
 
    rf.rdb$relation_name = :RN
 
    AND NOT rf.rdb$field_name IN (
 
      SELECT s.rdb$field_name
 
      FROM
 
        rdb$index_segments s
 
        JOIN rdb$relation_constraints rc ON
 
          rc.rdb$index_name = s.rdb$index_name
 
          AND rc.rdb$constraint_type = 'FOREIGN KEY'
 
          AND rc.rdb$relation_name = :RN
 
    )
 
   
 
  ORDER BY
 
    4
 
 
=== Дамены ===
 
 
RDB$FIELDS (дамены)
 
 
Выбраць усе дамены БД (яны захоўваюцца ў табліцы RDB$FIELDS)
 
 
  select *
 
  from rdb$fields
 
 
Выбраць імёны палёў, якія маюць тып (дамен) ня NULL
 
 
  select f.rdb$field_name, f.rdb$relation_name
 
  from rdb$relation_fields f
 
    join rdb$fields d
 
      on d.rdb$field_name = f.rdb$field_source
 
  where d.rdb$null_flag = 1
 
 
=== Абмежавальнікі ===
 
 
RDB$RELATION_CONSTRAINTS (абмежавальнікі: першасныя і вонкавыя ключы, NOT NULL, інш.)
 
 
Выбраць усе абмежавальнікі ўсіх табліц БД
 
 
  select *
 
  from rdb$relation_constraints
 
 
Сьпіс табліц і палёў па якім існуюць два ці болей аднолькавыя зьнешнія спасылкі.
 
 
<syntaxhighlight lang="SQL">
 
SELECT
 
  rf.rdb$relation_name,
 
  rf.rdb$field_name,
 
  LIST(TRIM(rc.rdb$constraint_name)),
 
  COUNT(*)
 
FROM
 
  rdb$indices i
 
  JOIN rdb$index_segments iseg ON iseg.rdb$index_name = i.rdb$index_name
 
  JOIN rdb$relation_constraints rc ON rc.rdb$index_name = i.rdb$index_name
 
    AND rc.rdb$constraint_type = 'FOREIGN KEY'
 
  JOIN rdb$relation_fields rf ON rf.rdb$relation_name = i.rdb$relation_name
 
    AND iseg.rdb$field_name = rf.rdb$field_name
 
GROUP BY
 
  1, 2
 
HAVING
 
  COUNT(*) > 1
 
</syntaxhighlight>
 
 
=== Індэксы ===
 
 
RDB$INDICES (індэксы)
 
 
Выбраць усе індэксы ўсіх табліц БД
 
 
  select *
 
  from rdb$indices
 
 
Выбраць усе табліцы, якія спасылаюцца на табліцу GD_DOCUMENT
 
 
  select rdb$relation_name
 
  from rdb$indices
 
  where rdb$foreign_key = 'GD_PK_DOCUMENT'
 
 
Выбраць усе табліцы, якія спасылаюцца на табліцу GD_DOCUMENT, выключаючы дубліруючыя запісы
 
 
  select distinct rdb$relation_name
 
  from rdb$indices
 
  where rdb$foreign_key = 'GD_PK_DOCUMENT'
 
 
RDB$INDEX_SEGMENTS (складнікі індэксаў, зь якіх палёў складаюцца індэксы)
 
 
Выбраць складнікі (палі) ўсіх індэксаў
 
 
  select *
 
  from rdb$index_segments
 
 
 
  select i.rdb$relation_name, s.rdb$field_name
 
  from rdb$indices i
 
    join rdb$index_segments s
 
      on i.rdb$index_name = s.rdb$index_name
 
 
Палі табліц, якія зьвязаныя з табліцай GD_DOCUMENT
 
 
  select i.rdb$relation_name, s.rdb$field_name
 
  from  rdb$indices i
 
    join rdb$index_segments s
 
      on i.rdb$index_name = s.rdb$index_name
 
        and i.rdb$foreign_key = 'GD_PK_DOCUMENT'
 
 
=== Залежнасьці ===
 
 
RDB$DEPENDENCIES (залежнасьці паміж табліцамі)
 
 
Выбраць усе залежнасьці паміж табліцамі БД
 
 
  select *
 
  from rdb$dependencies
 
 
Выбраць усе дамены Гедыміна
 
 
  select *
 
  from AT_FIELDS
 
 
=== Список всех полей и таблиц, которые ссылаются на заданную таблицу ===
 
 
<syntaxhighlight lang="SQL">
 
select
 
  'Поле',
 
  iseg.rdb$field_name,
 
  'таблицы',
 
  ifk.rdb$relation_name,
 
  'ссылается на поле',
 
  ipkseg.rdb$field_name,
 
  'таблицы',
 
  i.rdb$relation_name
 
 
 
from
 
  rdb$relation_constraints cs
 
    join rdb$ref_constraints rc on rc.rdb$constraint_name = cs.rdb$constraint_name
 
    join rdb$relation_constraints ps on ps.rdb$constraint_name = rc.rdb$const_name_uq
 
    join rdb$indices i on i.rdb$index_name = ps.rdb$index_name
 
    join rdb$index_segments ipkseg on i.rdb$index_name = ipkseg.rdb$index_name
 
    join rdb$indices ifk on ifk.rdb$index_name = cs.rdb$index_name
 
    join rdb$index_segments iseg on iseg.rdb$index_name = ifk.rdb$index_name
 
 
 
where
 
  i.rdb$relation_name = :RN
 
</syntaxhighlight>
 
  
 
[[Category:База данных]]
 
[[Category:База данных]]
 +
[[Category:Школа системного администратора]]

Текущая версия на 17:14, 18 мая 2011

Ниже приводится список полезных запросов к таблицам Гедымина. По этой теме, см. также Полезные запросы к системным таблицам Firebird.

[править] Документы

Среднее количество позиций по документу с позициями в базе данных:

select
  (select count (*) from gd_document where not parent is null) /
  (select count (distinct parent) from gd_document where not parent is null)
from
  rdb$database

[править] Сообщения

Распределение количества обращений клиентов по месяцам:

select
  extract(year from m.msgstartdate),
  extract(month from m.msgstartdate),
  count(m.subject)
from
  msg_message m join gd_contact c
    on c.id = m.fromcontactkey
where
  /* добавьте сюда условие для отбора по     */
  /* конкретному клиенту или группе клиентов */
  UPPER(c.name) LIKE '%'
group by
  1, 2
order by
  1 desc, 2 desc

Количество обращений по клиенту за заданный промежуток времени:

select
  c.name,
  count(c.name)
from
  gd_contact c join msg_message m
    on c.id = m.fromcontactkey
where
  /* укажите здесь период и условия отбора клиентов */
  m.msgstartdate between '01.06.2006' and '30.11.2006'
  and UPPER(c.name) LIKE 'ИП%'
group by
  c.name
order by
  2 desc

[править] Справочник клиентов

Запрос извлекает контакты, наименования которых начинаются с одинаковой последовательности символов. Длину последовательности можно регулировать.

select
  c.id, c2.id, c.name, c2.name
from
  gd_contact c join gd_contact c2
    on SUBSTRING(UPPER(c.name) FROM 1 FOR 9) = SUBSTRING(UPPER(c2.name) FROM 1 FOR 9)
    and c.id <> c2.id
where
  /* задайте здесь условие, для того, чтобы вести поиск не по всем контактам */
  UPPER(c.name) LIKE 'ИП%'
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты