繁体   English   中英

使用SQL进行表外部联接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM