Sql 负号是如何工作的
我有两张桌子Sql 负号是如何工作的,sql,oracle,join,Sql,Oracle,Join,我有两张桌子 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 tabl
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
我能做什么?单独选择两个很好,我只想做第一个选择结果减去第二个选择结果。为什么
13 25
14 26
而不是
13 26
14 25
?
如果您只是要求第1列是表1和表2中ID的数字顺序行列表,第2列是表2中存在但表1中不存在的行,那么您需要返回两个可能具有不同长度的不相关列表。在这种情况下,任何给定行中的值之间的相关性是它们在各自数据集中的排名
因此,可以这样做:
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
为什么
而不是
13 26
14 25
?
如果您只是要求第1列是表1和表2中ID的数字顺序行列表,第2列是表2中存在但表1中不存在的行,那么您需要返回两个可能具有不同长度的不相关列表。在这种情况下,任何给定行中的值之间的相关性是它们在各自数据集中的排名
因此,可以这样做:
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
你不能用
减号做你想做的事。您正在尝试执行(A-B)联合(B-A)
。对不起,我不明白,但会的try@vkp事实上,它甚至更复杂,因为OP想要并列两个结果集。@ifooi:使用减号可以从结果集中删除整个记录。相反,您希望对来自不同结果集的列进行配对。但是,在第一次查询生成的基本结果集中,不会将它们配对,减号操作符也不会执行此类操作。顺便说一句,通常列并置没有多大意义,因为封装在单个记录中的信息在语义上是不相关的。使用减号
不能做任何你想做的事情。您正在尝试执行(A-B)联合(B-A)
。对不起,我不明白,但会的try@vkp事实上,它甚至更复杂,因为OP想要并列两个结果集。@ifooi:使用减号可以从结果集中删除整个记录。相反,您希望对来自不同结果集的列进行配对。但是,在第一次查询生成的基本结果集中,不会将它们配对,减号操作符也不会执行此类操作。顺便说一句,通常列并置没有多大意义,因为封装在单个记录中的信息在语义上没有关联。谢谢。今晚我仍然不理解减号,但我喜欢rank,减号在一个查询中给出在第二个查询中没有出现的记录,所以我可以重写第二个子查询,使用减号来获取所有t2.a,其中不存在t1.a,但是排序和排名要求减号是嵌套的子选择。所以我使用了外部连接作为更合适的构造。我理解你的构造。但还是想知道为什么我的负号不起作用。减号只适用于一列,但不适用于两列。列名和类型类似。第一列是有匹配项的记录,第二列是不匹配的数据,因此如何使用减号来包含属于这两个类别的数据?减号意味着“不匹配”,所以用它来获取第1列的信息并不是它的意思。谢谢。今晚我仍然不理解减号,但我喜欢rank,减号在一个查询中给出在第二个查询中没有出现的记录,所以我可以重写第二个子查询,使用减号来获取所有t2.a,其中不存在t1.a,但是排序和排名要求减号是嵌套的子选择。所以我使用了外部连接作为更合适的构造。我理解你的构造。但还是想知道为什么我的负号不起作用。减号只适用于一列,但不适用于两列。列名和类型类似。第一列是有匹配项的记录,第二列是不匹配的数据,因此如何使用减号来包含属于这两个类别的数据?减号意味着“不匹配”,所以用它来获取第1列的信息并不是它的意思。