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))
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))
你可以在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)。這是你必須小心的事情 - 我以前曾經被一個糟糕的假設所困住。
symdiff做什麼? – Moeb 2010-10-15 17:40:44
它爲子查詢提供了一個名稱 - 並且名義上由SQL標準所要求。否則,它困惑不幸的提問者?我可以 - 也許應該 - 寫了'SELECT symdiff。* ...'。 – 2010-10-15 17:45:11
對稱差異?你的表有主鍵嗎? – 2010-10-15 17:33:14
是的,他們有主鍵@Jonathan。 – Moeb 2010-10-15 17:40:13