如何在SQL*Plus中重写优先级?

如何在SQL*Plus中重写优先级?,sql,sqlplus,Sql,Sqlplus,我如何确保它被解析为这样 select * from tab1 minus select * from tab2 union select * from tab2 minus select * from tab1 你能像这样在FROM子句中使用括号里的表达式吗 ((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

你能像这样在FROM子句中使用括号里的表达式吗

((select * from tab1
minus
select * from tab2)
union
(select * from tab2
minus
select * from tab1))
如果表的等效列上有主键,则可以使用:

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

但是,这被删除了,因为没有任何东西可以阻止表tab1(pk,othercol)有一行(pk=1,othercol=2),而tab2(pk,othercol)有一行(pk=1,othercol=3)。这是你必须小心的一点——我曾经被错误的假设抓住过一次。

对称差异?您的表有主键吗?是的,它们有主键,@Jonathan。它为子查询提供了一个名称,这在名义上是SQL标准所要求的。否则,这会让倒霉的提问者感到困惑吗?我本可以——也许应该——写下“SELECT 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)