我正在尝试加入几个表来实现以下结果
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),但它为某些行提供了空值
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声明是我失败的尝试o得到我在追求
答案 0 :(得分:1)
您的SQL完全按预期工作。
外部联接是: &#34;两个表中的所有行,如果连接条件匹配则连接在一起...如果没有,它将显示空值。&#34;
表2中没有一行:9997,9996,9995,9994或9993 因此,这些行不会与table2中的行匹配,而是显示NULL。
我不认为我曾经见过有人试图在加入条件中使用OR ......所以我无法评论这是否真的应该有效,但我怀疑它只是没有(如果确实如此,请随时向我展示解释它的文档,我想学习)。
读取它看起来像一个连接条件就像一个布尔运算符...在这种情况下 - 它可能会失败,因为多行符合OR条件
答案 1 :(得分:0)
您的预期输出显示内部联接的结果,而不是外部结果。您希望Table1中的每一行都与Table2中的某些匹配。
一种方法是生成中间结果集。你没有指定DBMS(tsk,tsk),因此我无法判断它是否具有CTE功能,但大多数都这样做,这就是你得到的。
中间结果集包含两个表之间匹配的Counter值列表。现在只需使用中间项连接表来指定完成连接的Counter值。请参阅输出 here
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;
键是子查询,如果匹配,则返回Counter值,或者返回最低的先前匹配值。