2013-06-18 37 views
0

當確認轉向存儲過程不會使其預期功能(A點的數據到達B點)停止工作時,我經常使用MINUSEXCEPT在sql server中)。然而,這迫使我跑兩次每個查詢(因爲減去返回存在於第一/頂級表沒有在第二/底部存在行):替換兩個MINUS/EXCEPT查詢

SELECT value1, value2, value3 FROM table1 WHERE uploadID = 'beforeTurning' 
MINUS 
SELECT value1, value2, value3 FROM table1 WHERE uploadID = 'afterTurning'; 

SELECT value1, value2, value3 FROM table1 WHERE uploadID = 'afterTurning' 
MINUS 
SELECT value1, value2, value3 FROM table1 WHERE uploadID = 'beforeTruning'; 

我能做到用一個同樣的事情查詢?我會怎麼做?

+2

您的查詢甚至不排除任何東西,因爲在第一個查詢值和第二永諾將至少通過(在第一部分「beforeTunning」,並在第二個「afterTunning」)領域UPLOADID不同。所以,沒有任何東西會被排除在第一個查詢之外。 – Mikhail

+0

@Mikhail我會更新我的例子:) – Zzz

+0

那麼就使用NOT EXISTS :)類似的東西'SELECT value1,value2,value3 FROM table1 t1 WHERE uploadID ='beforeTunning'AND NOT EXISTS(SELECT * FROM table1 t2 WHERE t1。 value1 = t2.value1 AND t1.value2 = t2.value2 AND t1.value3 = t2.value3 AND t2.uploadID ='afterTunning')UNION SELECT value1,value2,value3 FROM table1 t1 WHERE uploadID ='afterTunning'AND NOT EXISTS( SELECT * FROM table1 t2 WHERE t1.value1 = t2.value1 AND t1.value2 = t2.value2 AND t1.value3 = t2.value3 AND t2.uploadID ='beforeTunning')' – Mikhail

回答

1
SELECT 
    value1, value2, value3, 
    sum(decode(uploadID, 'afterTurning', 1, 'beforeTurning', -1)) AS diff 
FROM table1 
GROUP BY value1, value2, value3 
HAVING sum(decode(uploadID, 'afterTurning', 1, 'beforeTurning', -1)) <> 0 
0

這裏有一種方法:

WITH 
    BeforeAfter AS (
    SELECT * FROM table1 WHERE uploadID = 'beforeTunning' 
    MINUS SELECT * FROM table1 WHERE uploadID = 'afterTunning'), 
    AfterBefore AS (
    SELECT * FROM table1 WHERE uploadID = 'afterTunning' 
    MINUS SELECT * FROM table1 WHERE uploadID = 'beforeTunning') 
SELECT * FROM BeforeAfter 
UNION ALL SELECT * FROM AfterBefore 

一個UNION可能比UNION ALL爲您提供更好 - 你的電話有。