【问题标题】:how minus works减号是如何工作的
【发布时间】:2015-12-01 14:45:48
【问题描述】:

我有两张桌子

create table table1 (tb1 number);
insert into table1 values (13);
insert into table1 values (14);
insert into table1 values (15);
insert into table1 values (16);
create table table2(tb2 number);
insert into table2 values (13);
insert into table2 values (14);
insert into table2 values (25);
insert into table2 values (26);

我想在左列中输出内部连接值,在右列中输出表 2 中的不同右值。所以应该是

13 25
14 26

我尝试使用减号

select  table1.tb1, table2.tb2  from table1 right  join table2 on table1.tb1= table2.tb2 
minus 
select  null, table2.tb2 from table1 inner join table2 on table1.tb1=table2.tb2
;

但是我得到了

13 13
14 14
   25
   26

我能做什么?单独两个选择工作正常,我只想做第一个选择结果减去第二个选择结果。

【问题讨论】:

  • 你不能用minus 做你想做的事。你正在尝试做(A-B) union (B-A)
  • 对不起,不明白但会尝试
  • @vkp 实际上它更加复杂,因为 OP 想要并列两个结果集。
  • @ifooi:使用minus,您正在从结果集中消除整个记录。相反,您希望对来自不同结果集中的列进行配对。但是,您不会在第一个查询生成的基本结果集中将它们配对,minus 运算符也不会执行这样的操作。顺便说一句,通常列并置没有多大意义,因为包装到单个记录中的信息在语义上不相关。

标签: sql oracle join


【解决方案1】:

为什么

13 25
14 26

而不是

13 26
14 25

?

如果您只是要求第 1 列是 table1 和 table2 中出现的 ID 按数字顺序排列的行列表,并且第 2 列是 table2 中存在但不存在于 table1 中的行,那么您正在考虑将返回两个可能具有不同长度的不相关列表。在这种情况下,任何给定行中的值之间的相关性就是它们在各自数据集中的排名

所以 - 可以这样完成:

with t1 as ( 
          select 13 a from dual
union all select 14 a from dual
union all select 15 a from dual
union all select 16 a from dual)
, t2 as (
          select 13 a from dual
union all select 14 a from dual
union all select 25 a from dual
union all select 26 a from dual)
select sub1.a  t1_a
      ,sub2.a  t2_a
from      
(-- subquery to get common values and their rankings
 select t1.a
      ,rank() over (order by t1.a) rnk
from t1 join t2 on t1.a = t2.a) sub1
full outer join 
(--subquery to get the values only in t2 and their rankings
 select t2.a
      ,rank() over (order by t2.a) rnk
from t1 right outer join t2 on t2.a = t1.a
where t1.a is null) sub2
-- join on the ranking. This is needed to avoid a cartesien product.
using (rnk)

t1_A                                   t2_a                                    
13                                     25                                     
14                                     26                                     

【讨论】:

  • 谢谢。今晚仍然不了解减号,但我喜欢排名,
  • minus 给出一个查询中没有出现在第二个查询中的记录,所以我可以重写第二个子查询以使用减号来获取所有 t2.a 不存在 t1.a 的地方,但是那么排序和排名将要求该减号是嵌套的子选择。所以我使用外连接作为更合适的构造。
  • 我理解你的结构。但仍然尝试了解为什么我的减号不起作用。减号适用于一列,但不适用于两列。列名和类型相似。
  • 您的第一列是匹配的记录,第二列是不匹配的数据,那么如何减号以包含同时属于这两个类别的数据?减号意味着“不匹配”,因此使用它来获取第 1 列信息并不是它的本意。
猜你喜欢
  • 2017-01-02
  • 2013-07-06
  • 2018-11-16
  • 2010-11-16
  • 2011-05-11
  • 2010-10-13
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
相关资源
最近更新 更多