2010-10-15 32 views
0
select * from tab1 
minus 
select * from tab2 
union 
select * from tab2 
minus 
select * from tab1 

我怎樣才能確保它被解析爲這樣?如何覆蓋SQL * Plus中的優先級?

((select * from tab1 
minus 
select * from tab2) 
union 
(select * from tab2 
minus 
select * from tab1)) 
+0

對稱差異?你的表有主鍵嗎? – 2010-10-15 17:33:14

+0

是的,他們有主鍵@Jonathan。 – Moeb 2010-10-15 17:40:13

回答

1

你可以在FROM子句中使用括號表達式嗎?

SELECT * 
FROM ((select * from tab1 minus select * from tab2) 
     UNION 
     (select * from tab2 minus select * from tab1)) AS symdiff 

如果表對相當於列的主鍵,你可以使用:

SELECT tab1.* 
    FROM tab1 
WHERE tab1.pk NOT IN (SELECT tab2.pk FROM tab2) 
UNION -- optionally UNION ALL 
SELECT tab2.* 
    FROM tab2 
WHERE tab2.pk NOT IN (SELECT tab1.pk FROM tab2) 

然而,被剔除,因爲沒有什麼阻止表TAB1 (pk,othercol)有一行(pk = 1,othercol = 2),而tab2(pk,othercol)包含一行(pk = 1,othercol = 3)。這是你必須小心的事情 - 我以前曾經被一個糟糕的假設所困住。

+0

symdiff做什麼? – Moeb 2010-10-15 17:40:44

+0

它爲子查詢提供了一個名稱 - 並且名義上由SQL標準所要求。否則,它困惑不幸的提問者?我可以 - 也許應該 - 寫了'SELECT symdiff。* ...'。 – 2010-10-15 17:45:11