Sql 选择减号运算符的两侧

Sql 选择减号运算符的两侧,sql,oracle,Sql,Oracle,我想找出减号查询两侧每个所有者的表名的差异 假设我从一个表中有2条select语句,我想将它们进行比较: 选择1: SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha'; 选择2: SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie'; 假设alpha的表有表名:a,b,c,charlie的表有表名b,c 如果我这样做 (SELECT TABLE_NAME FROM A

我想找出减号查询两侧每个所有者的表名的差异

假设我从一个表中有2条select语句,我想将它们进行比较:

选择1:

SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha';  
选择2:

SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie';
假设alpha的表有表名:a,b,c,charlie的表有表名b,c

如果我这样做

(SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha') minus    
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie';    
这给了我预期的结果:a

相反,如果我做相反的事情:

  (SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie') minus    
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha';    
这给了我预期的结果:空行

现在,如果我想要表名“a”和执行的空行:

(SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha') minus 
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie'
  Union
(SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie') minus 
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha';
那我什么也得不到

如何将“a”行和空行组合返回?
我使用的是Oracle DB

如果你明白我的意思,你想要的似乎是
联合
减去
?计算并集,计算交集,并在这两个结果集之间执行
减号
(使用适当的括号,这是当前努力失败的地方,因为
并集
减号
具有相同的优先级)


我相信,这正确地反映了你的逻辑要求。解决眼前的问题。但我相信你的努力(以及他们的解决方案)掩盖了这里的意图。

如果你明白我的意思,你想要的似乎是
联合
减去
?计算并集,计算交集,并在这两个结果集之间执行
减号
(使用适当的括号,这是当前努力失败的地方,因为
并集
减号
具有相同的优先级)


我相信,这正确地反映了你的逻辑要求。解决眼前的问题。但我相信你的努力(以及他们的解决方案)掩盖了这里的意图。

只需在联合后使用括号即可

(SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha') minus 
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie'

  Union
(
(SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie') minus 
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha'
)
范例

with t1 as
(
select 62054 as  sample_id,'2018-09-25 10:18:15' as timestamp,2652 as p_id from dual
union all
select 62054 as  sample_id,'2018-09-27 16:44:57' as timestamp,966 as p_id from dual
union all
select 62046 as  sample_id,null ,1809 as p_id from dual
union all
select 62046 , '018-09-25 10:18:15' ,2097  from dual



) select * from t1 where p_id=2652
 minus
 select * from t1 where p_id=966
 union

 select * from t1 where p_id=2652
 minus
 select * from t1 where p_id=2652
上述参数将返回null 但是

上面的内容将返回到下面

SAMPLE_ID   TIMESTAMP   P_ID
62054   2018-09-25 10:18:15 2652

只需在并集后使用括号

(SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha') minus 
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie'

  Union
(
(SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'charlie') minus 
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'alpha'
)
范例

with t1 as
(
select 62054 as  sample_id,'2018-09-25 10:18:15' as timestamp,2652 as p_id from dual
union all
select 62054 as  sample_id,'2018-09-27 16:44:57' as timestamp,966 as p_id from dual
union all
select 62046 as  sample_id,null ,1809 as p_id from dual
union all
select 62046 , '018-09-25 10:18:15' ,2097  from dual



) select * from t1 where p_id=2652
 minus
 select * from t1 where p_id=966
 union

 select * from t1 where p_id=2652
 minus
 select * from t1 where p_id=2652
上述参数将返回null 但是

上面的内容将返回到下面

SAMPLE_ID   TIMESTAMP   P_ID
62054   2018-09-25 10:18:15 2652