2016-05-18 450 views
1

我試圖重新創建此查詢,而無需使用UNION ALL聲明,我已經試過 標量子查詢和示範條款,但沒有似乎做我想做的。我的經理不希望使用UNION ALL,但我實在不明白的替代方案是什麼替代UNION ALL中的Oracle SQL

任何幫助將是巨大的

SELECT null AS UDA_ID, 
     'Style-Level Attributes' AS UDA_DESC, 
     null AS DISPLAY_TYPE, 
     null AS REQUIRED_IND, 
     null AS ITEM, 
     null AS UDA_TEXT, 
     null AS UDA_DATE, 
     null AS UDA_VALUE 
FROM DUAL 
UNION ALL     
select a.UDA_ID, 
     a.UDA_DESC, 
     a.DISPLAY_TYPE, 
     a.REQUIRED_IND, 
     b.ITEM, 
     b.UDA_TEXT, 
     b.UDA_DATE, 
     b.UDA_VALUE    
from DAL.P_UDA a, 
     FFEDEV.FFE_ITEM_UDA b     
where a.UDA_ID = b.UDA_ID (+)     
AND a.REQUIRED_IND IS NOT NULL  
AND b.ITEM_PARENT IS NULL  
UNION ALL 
SELECT null AS UDA_ID, 
     'Additional Attributes' AS UDA_DESC, 
     null AS DISPLAY_TYPE, 
     null AS REQUIRED_IND, 
     null AS ITEM, 
     null AS UDA_TEXT, 
     null AS UDA_DATE, 
     null AS UDA_VALUE 
FROM DUAL 
UNION ALL     
select a.UDA_ID, 
     a.UDA_DESC, 
     a.DISPLAY_TYPE, 
     a.REQUIRED_IND, 
     b.ITEM, 
     b.UDA_TEXT, 
     b.UDA_DATE, 
     b.UDA_VALUE   
from DAL.P_UDA a, 
     FFEDEV.FFE_ITEM_UDA b     
where a.UDA_ID = b.UDA_ID (+)     
AND a.REQUIRED_IND IS NULL  
AND b.ITEM_PARENT IS NULL 
+0

這就是爲什麼'UNION'已創建。如果你堅持這樣做,你可以用'FULL OUTER JOIN ON(1 = 2)'這一切的查詢之間,和'NVL'或'CASE EXPRESSION'更換空值,這將做同樣的工會。 – sagi

+0

將結果行用作標題是很奇怪的。所選行只能包含數據。因此,您應該將包含「樣式級別屬性」或「附加屬性」的列添加到結果行中。然後,您的查詢不能保證按照您的要求工作。如果沒有'ORDER BY'子句,則不能保證排序。所有'UNION ALL'的承諾是行都得到結果,而不是以什麼順序。一旦你的查詢在並行線程中執行,你可能會看到你的記錄混雜在一起。那麼你不應該再使用已經被棄用的連接語法。 –

回答

5

我注意到,在您的查詢的唯一的真正的功能差異是在兩條WHERE條款。在UNION ALL病症的第一半部具有:

WHERE a.REQUIRED_IND IS NOT NULL 

,而第二半部具有:

WHERE a.REQUIRED_IND IS NULL 

可以使用CASE表達生成包含該屬性類型計算列。爲了清楚起見,這裏是CASE表達自己:

CASE WHEN a.REQUIRED_IND IS NOT NULL 
    THEN 'Style-Level Attributes' 
    ELSE 'Additional Attributes' 
END AS UDA_DESC 

這裏是完整的查詢:

SELECT CASE WHEN a.REQUIRED_IND IS NOT NULL THEN 'Style-Level Attributes' ELSE 'Additional Attributes' END AS AttrType, 
    a.UDA_ID, a.UDA_DESC, a.DISPLAY_TYPE, a.REQUIRED_IND, b.ITEM, b.UDA_TEXT, b.UDA_DATE, b.UDA_VALUE 
FROM DAL.P_UDA a 
LEFT OUTER JOIN FFEDEV.FFE_ITEM_UDA b 
    ON a.UDA_ID = b.UDA_ID 
WHERE b.ITEM_PARENT IS NULL 
ORDER BY AttrType 

在此查詢的唯一潛在的主要挫折是你失去了兩個空標題行。但是,爲了報告目的,應該沒有問題。如果你的老闆堅持這些空的標題行,那麼告訴他們它們是合成的數據,將它們添加到結果集的唯一方法是做一個UNION

+1

我想你需要刪除'REQUIRED_IND IS NOT NULL',這就是你所解釋的。此外,默認的空行將會丟失。您還應該在這裏回答正確的連接語法 – sagi

+0

這會導致無效的標識符,因爲第一條語句是從雙重選擇而不是必需的表中選擇的。 – James

+1

因爲我們現在可以包含每個記錄的屬性類型,所以不需要我已經刪除的'null'標題行。相反,我添加了這種類型的新列。 –