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

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Табліцы БД)
(Палі табліц)
Строка 135: Строка 135:
 
   from rdb$relation_fields r
 
   from rdb$relation_fields r
 
   where r.rdb$field_name = 'LB'
 
   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
  
 
=== Дамены ===
 
=== Дамены ===

Версия 16:51, 30 августа 2007

Ниже приводится список полезных запросов.

Содержание

Документы

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

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 'ИП%'

Запросы к системным таблицам

Табліцы БД

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

Індэксы

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
Персональные инструменты
Пространства имён

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