2012-07-21 50 views
0

的通用替代方式,我有一個表attach巨大的數據集,它是一個臨時表,並通過SQL創建:如何編寫一個Oracle查詢作爲工會

id number name 
    1  X1  name1 
    2  X2  name2 
    3  X3  name3 
    4  X4  name4 

attachment_map

id item attach_id file_id versionid 
    1  X1  1   100   0 
    2  X2  0   0   1 

version

id attach_id 
    1  2  

我想有QUER y以獲得:

id number name item 
    1  X1  name1 X1 
    2  X2  name2 X2 
    3  X3  name3 
    4  X4  name4 

正如你可以看到,返回的行添加新列這實際上從表attachment_map了,那裏有三個impossibles:

1)。 attach沒有物品。

2)。通過連接attachment_map的列attach_id來保存項目。

2)。通過連接到的列attach_id來保存項目。

我寫了一個查詢,但表現不佳,慢慢執行,看起來是因爲聯合。每個人都可以用另一種方式說話,或者我可以如何改進它?感謝

WITH tb AS 
(SELECT t.*, 
i.item 
FROM attach t, 
    attachment_map am, 
    version v 
WHERE (am.attach_id = t.attachid 
OR (am.file_id  = 0 
AND am.version_id = v.id)) 
) 
SELECT * FROM tb 
UNION 
SELECT tb.*, NULL FROM tb, attach WHERE tp.id NOT IN (attach.id); 
+0

別名「我」指的是什麼(i.item)? – davek 2012-07-21 17:23:57

+0

是不是這是一個左連接? – codingbiz 2012-07-21 17:25:52

+0

不是一個完整的左連接,因爲正如我所提到的,有三個不可能獲得的項目值 – 2012-07-22 03:18:22

回答

0

使用兩LEFT OUTER JOIN s到三個錶鏈接,然後在CASE優先順序的item字段(首先檢查連接,然後attachment_map,然後版)。

SELECT t.* 
, case when t.attach_id is null then 
    case when am.attach_id is null then 
     v.item 
    else 
     am_attach.item 
    end 
else 
    t.item 
end as chosen_item 

FROM attach t 
left outer join attachment_map am on am.attach_id = t.attachid 
left outer join version v on am.version_id = v.id 
+0

而不是一個案例表達式,你可以直接在各個項目上使用coalesce? – 2012-07-21 17:48:07

+0

@Tom:是的,這應該工作得很好(我認爲* COALESCE是SQL標準,在這種情況下它會好一點) – davek 2012-07-21 17:56:26

+0

我相信'coalesce'和'case'都是標準的。這並不是說數據庫中的可用實現符合標準! – 2012-07-22 09:20:19