Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 负号是如何工作的_Sql_Oracle_Join - Fatal编程技术网

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列的信息并不是它的意思。