SELECT
isg2.RDB$FIELD_NAME FirstField
, rc2.RDB$RELATION_NAME NetTable
, isg4.RDB$FIELD_NAME SecondField
, rc5.RDB$RELATION_NAME TargetTable
, isg6.RDB$FIELD_NAME TargetField
, (SELECT 1
FROM RDB$DATABASE
WHERE
EXISTS(SELECT *
FROM RDB$RELATION_FIELDS rf
WHERE rc5.RDB$RELATION_NAME = rf.RDB$RELATION_NAME
AND rf.RDB$FIELD_NAME = 'LB')
AND EXISTS(SELECT *
FROM RDB$RELATION_FIELDS rf
WHERE rc5.RDB$RELATION_NAME = rf.RDB$RELATION_NAME
AND rf.RDB$FIELD_NAME = 'RB')) IsTree
FROM
RDB$INDEX_SEGMENTS isg1
, RDB$RELATION_CONSTRAINTS rc1
, RDB$REF_CONSTRAINTS rfc1
, RDB$RELATION_CONSTRAINTS rc2
, RDB$INDEX_SEGMENTS isg2
, RDB$INDEX_SEGMENTS isg3
, RDB$RELATION_CONSTRAINTS rc3
, RDB$INDEX_SEGMENTS isg4
, RDB$INDEX_SEGMENTS isg5
, RDB$RELATION_CONSTRAINTS rc4
, RDB$REF_CONSTRAINTS rfc2
, RDB$RELATION_CONSTRAINTS rc5
, RDB$INDEX_SEGMENTS isg6
WHERE
rc1.RDB$RELATION_NAME = :tablename
AND rc1.RDB$INDEX_NAME = isg1.RDB$INDEX_NAME
AND rc1.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
AND rfc1.RDB$CONSTRAINT_NAME = rc2.RDB$CONSTRAINT_NAME
AND rfc1.RDB$CONST_NAME_UQ = rc1.RDB$CONSTRAINT_NAME
AND rc2.RDB$INDEX_NAME = isg2.RDB$INDEX_NAME
AND rc1.RDB$RELATION_NAME <> rc2.RDB$RELATION_NAME
AND isg3.RDB$FIELD_NAME = isg2.RDB$FIELD_NAME
AND rc3.RDB$RELATION_NAME = rc2.RDB$RELATION_NAME
AND rc3.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
AND rc3.RDB$INDEX_NAME = isg3.RDB$INDEX_NAME
AND isg4.RDB$INDEX_NAME = isg3.RDB$INDEX_NAME
AND isg2.RDB$FIELD_NAME <> isg4.RDB$FIELD_NAME
AND isg5.RDB$FIELD_NAME = isg4.RDB$FIELD_NAME
AND rc4.RDB$INDEX_NAME = isg5.RDB$INDEX_NAME
AND rc4.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY'
AND rc4.RDB$RELATION_NAME = rc2.RDB$RELATION_NAME
AND rfc2.RDB$CONSTRAINT_NAME = rc4.RDB$CONSTRAINT_NAME
AND rfc2.RDB$CONST_NAME_UQ = rc5.RDB$CONSTRAINT_NAME
AND rc5.RDB$INDEX_NAME = isg6.RDB$INDEX_NAME
Возвращает список атрибутов типа множество для заданной таблицы.
16 июн. 2010 г.
Неявные JOIN-ы
Такие вот запросы практиковались в раннем Гедымине:
Labels:
SQL
Комментариев нет:
Отправить комментарий