2016-06-01 4 views
0

Я пытаюсь получить список полей, сгруппированных по отношениям, используя поля RDB $ и RDB $ Relation_Fields. Следит SQL:Выберите выделение с несколькими таблицами

select distinct 
     RDB$relation_Fields.RDB$relation_name as "Relation Name" , 
     RDB$relation_Fields.RDB$field_name as "Field Name " , 
     (select RDB$Fields.RDB$Field_Type  as "Field Type" 
      from RDB$Fields 
      where RDB$Fields.rdb$Field_Name = 
       RDB$relation_Fields.RDB$Field_Name) 
from 
    RDB$fields   , 
    RDB$relation_Fields 
where 
       RDB$relation_Fields.RDB$relation_name = 'Database_Table'  and 
    substring (     RDB$relation_name from 1 for 4) <> 'IDE$' and 
    substring (     RDB$relation_name from 1 for 4) <> 'MON$'     substring (     RDB$relation_name from 1 for 4) <> 'RDB$' 
    order by 
          RDB$relation_name, 
          RDB$relation_Fields.rdb$field_name 

я должен получить

Relation Name Field Name Field Type 
    ------------- ---------- ---------- 
    Database_Table Field1  TypeX 
    Database_Table Field2  TypeY 
    ...   ...  ... 

Вместо этого, я получаю

Relation Name Field Name Field Type 
    ------------- ---------- ---------- 
    Database_Table Field1  <null> 
    Database_Table Field2  <null> 
    ...   ...  <null> 

Пожалуйста, покажите мне правильный SQL.

ответ

3

Во-первых, необходимо соединить столы. В противном случае вы получили бы крест.

Кроме того, для столбца типа поля не требуется коррелированный подзапрос, так как таблицы уже объединены (при условии, что вы добавляете условие соединения - я добавил его на основе комментария Thorsten).

select rf.RDB$relation_name as "Relation Name" , 
     rf.RDB$field_name as "Field Name " , 
     f.RDB$Field_Type  as "Field Type" 
from RDB$fields f 
JOIN RDB$relation_Fields rf on f.RDB$FIELD_NAME = rf.RDB$FIELD_SOURCE 
where rf.RDB$relation_name = 'Database_Table'     
and substring (rf.RDB$relation_name from 1 for 4) not in ('IDE$','MON$','RDB$') 
order by rf.RDB$relation_name, rf.RDB$field_name 
+1

Очень хороший ответ. Вы можете сократить этот запрос с помощью 'substring (rf.RDB $ ratio_name от 1 для 4), а не ('IDE $', 'MON $' 'RDB $')', чтобы сделать его еще более удобочитаемым. –

+0

BTW: Предложение ON, вероятно, будет 'ON f.RDB $ FIELD_NAME = rf.RDB $ FIELD_SOURCE', см. Здесь: http://www.firebirdsql.org/file/community/conference-2014/pdf/22_tips_firebird_system_tables.pdf –

+0

Спасибо за все (ответ и комментарии)! Присоединение сделало разницу. Thorsten comment 1 очень полезен, и комментарий 2 был фундаментальным. – user2383818

Смежные вопросы