[英]Table Outer Join using SQL
我正在尝试加入几张桌子以达到如下结果
Table 1
Table1.Counter Table1.EFFCT From
9999 17/02/2014
9998 17/02/2014
9997 29/03/2014
9996 28/05/2014
9995 16/08/2014
9994 25/09/2014
9993 24/11/2014
9992 12/02/2015
Table 2
Table2.Counter Table2.EFFCT From Table2.EffectTo
9999 17/02/2014 16/02/2014
9998 17/02/2014 19/03/2014
9992 20/03/2014 1/01/9999
Expected output
Table1.Counter Table1.EFFCT From Table2.Counter Table2.EFFCT From Table2.EffectTo
9999 17/02/2014 9999 17/02/2014 16/02/2014
9998 17/02/2014 9998 17/02/2014 19/03/2014
9997 29/03/2014 9998 17/02/2014 19/03/2014
9996 28/05/2014 9998 17/02/2014 19/03/2014
9995 16/08/2014 9998 17/02/2014 19/03/2014
9994 25/09/2014 9998 17/02/2014 19/03/2014
9993 24/11/2014 9998 17/02/2014 19/03/2014
9992 12/02/2015 9992 20/03/2014 1/01/9999
我已经尝试了以下代码(不带OR),但为某些行提供了null
select Table1.Counter,
Table1.EFFCT_From,
Table2.Counter,
Table2.EFFCT_From,
Table2.EffectTo
From Table1
left outer join Table2
on (Table1.Counter = Table2.Counter and Table1.EFFCT_From = Table2.EFFCT_From)
OR (Table1.EFFCT_From = Table2.EFFCT_From and Table1.Counter < Table2.Counter )
Order by Table1.Counter;
这是在这种情况下联接两个表的一种方法
当我加入不带OR的下摆时,我得到以下结果。
Table1.Counter Table1.EFFCT From Table2.Counter Table2.EFFCT From Table2.EffectTo
9999 17/02/2014 9999 17/02/2014 16/02/2014
9998 17/02/2014 9998 17/02/2014 19/03/2014
9997 29/03/2014 Null Null Null
9996 28/05/2014 Null Null Null
9995 16/08/2014 Null Null Null
9994 25/09/2014 Null Null Null
9993 24/11/2014 Null Null Null
9992 12/02/2015 9992 20/03/2014 1/01/9999
OR陈述是我失败的尝试,无法得到我想要的
您的SQL完全按预期工作。
外部联接是:“两个表中的所有行,如果联接条件匹配则将它们联接在一起……如果不匹配,它将显示为空。”
您在表2中没有以下行:9997、9996、9995、9994或9993,因此这些行将不会与table2中的行匹配,而是显示NULL。
我认为我从未见过有人尝试在连接条件中使用OR ...所以我无法评论它是否真的应该工作,但是我怀疑它根本不起作用(如果可以,请随时向我展示说明文档(我想学习)。
读取它看起来像一个连接条件,就像布尔运算符...在这种情况下,它可能会失败,因为多行匹配OR条件
您的预期输出将显示内部联接的结果,而不是外部联接的结果。 您希望Table1中的每一行都与Table2中的某行匹配。
一种方法是生成中间结果集。 您没有指定DBMS(tsk,tsk),所以我无法确定它是否具有CTE功能,但是大多数情况下,这就是您所得到的。
中间结果集包含两个表之间具有匹配项的Counter值列表。 现在,只需使用中间连接表来指定完成连接的Counter值。 在此处查看输出
with
Matches( Counter )as(
select t1.Counter
from Table1 t1
join Table2 t2
on t2.Counter = T1.Counter
)
select t1.Counter T1_Counter, t1.EFFCT_From T1_EFFCT_From,
t2.Counter T2_Counter, t2.EFFCT_From T2_EFFCT_From, t2.EffectTo T2_EffectTo
from Table1 t1
join Table2 t2
on t2.Counter =(
select Min( Counter )
from Matches
where Counter >= t1.Counter )
order by t1.Counter desc;
关键是子查询,如果存在匹配项,则返回“计数器”值,或者返回先前的最低匹配值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.