2015-07-10 67 views
1

我有一個查詢,將行轉換爲列。只有存在值時才存在行。有與NULL內部或外部連接與樞軸查詢

Object Field_id value 
1  1   value1 
1  2   value2 
1  3   value3 
2  2   value4 

表示的值沒有行,我創建使用查詢的輸出

Object field1 field2 field3 
1  value1 value2 value3 
2    value4 

select * from 
    (
     select fs.field_name, s.text_value, s.id_object 
      from custom_field_str s , 
     (select ad.id_field field_id, fd.name field_name, 
num_display_order display_order, ad.text_table_name catalogue_table, ad.num_lines 
      from catalogues c 
      inner join attribute_definitions ad on c.id_object = ad.id_object_type 
      inner join field_definitions fd on ad.id_field = fd.id_object 
      where c.id_object = 'cA1') fs 
     where fs.catalogue_table = 'custom_field_str' 
      and fs.field_id = s.id_field 
    ) 
pivot 
    (max(text_value) 
for field_name IN ('field1' as field1,'field2' as field2,'field3' as field3) ) 

所以我的問題是,我應該使用custom_field_str和派生表fs之間的連接中的外連接。或者,PIVOT不需要全套結果來構建輸出網格?

回答

0

此行:where fs.field_id = s.id_field表示對於表中的每一行custom_field_str 必須在您的派生表fs中存在行。所以,你可以查詢更改爲簡單連接的版本,這是我的嘗試:

SQLFiddle

select * from (
    select fd.name field_name, s.text_value, s.id_object 
     from custom_field_str s 
     join catalogues c on c.id_object = 'cA1' 
     join attribute_definitions ad on ad.id_field = s.id_field 
     and c.id_object = ad.id_object_type and ad.text_table_name = 'custom_field_str' 
     join field_definitions fd on ad.id_field = fd.id_object) 
pivot (max(text_value) 
    for field_name in ('field1' as field1,'field2' as field2,'field3' as field3)) 
+0

感謝思考Stibbons。我有5個custom_field_ *表,我加入到一組工會中。所以我使用這種格式主要是爲了可讀性。 – Karl