表外连接使用SQL

时间:2015-02-17 01:30:14

标签: 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),但它为某些行提供了空值

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得到我在追求

2 个答案:

答案 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值,或者返回最低的先前匹配值。