左连接到一个表,其中值不存在(并且不是NULL)

时间:2017-09-19 13:40:21

标签: sql join null db2 left-join

编辑(求助):交叉加入。其中一个加入你直到你需要它才会使用。谢谢你的帮助

左表:TS,单值字段,值为[1,2,...,365]。

右表:包含三个字段(ID,TS,AMT)的付款

对于每个ID,我想在PAYMENT上看到来自TS的左连接的365条记录。

问题是"没有价值"与NULL不同。

如果PAYMENT.TS对于某个值不存在(例如PAYMENT.TS = 4),则没有值可以加入,左连接不返回第4行。

我尝试使用NOT IN / NOT EXISTS作为条件,但这仅处理右表具有显式NULLS而不存在值的情况。

我该怎么办?谢谢!

(这是一个DB2系统)

SELECT * FROM TS LEFT JOIN PAYMENT ON TS = PAYMENT.TS

TS表:

|   TS   |  
----------
    1           
    2       
   ...        
   365       

付款表:

|   ID   |   TS   |    PMT  |
-----------------------------
    1        1         70    
    1        2         20
    1        5         10 
    2        3         200

预期结果:

|   ID   |   TS   |    PMT  |
-----------------------------
    1        1         70 
    1        2         20
    1        3         
    1        4         
    1        5         10
   ...      ...
    1       365  

    2        1 
    2        2 
    2        3         200    
   ...      ...
    2       365 

实际结果:

|   ID   |   TS   |    PMT  |
-----------------------------
    1        1         70 
    1        2         20
    1        5         10
    2        3         200    

2 个答案:

答案 0 :(得分:0)

您必须加入它们,以匹配每个表中的两个公共列。最好是按键(外国和初级)。

假设TS表有一个名为'NUMBERS'的列,其类型为int。表PAYMENT具有列ID,int类型也是。这意味着他们可能有共同的价值观。因此,如果你想连接两个表并获得TS.NUMBERS中存在PAYMENT.ID的常见表,那么你应该这样做:

SELECT * FROM TS LEFT JOIN PAYMENT ON TS.NUMBERS = PAYMENT.ID

我希望我已经清楚了。

注意:另外请不要忘记,如果一个或多个列在两个表中都具有相同的名称,则必须澄清您希望该列的表,例如,如果PAYMENT表的列也已命名为NUMBERS,则:< / p>

SELECT PAYMENT.ID,TS.NUMBERS来自TS LEFT JOIN PAYMENT在TS.NUMBERS = PAYMENT.ID

答案 1 :(得分:0)

您需要使用cross join生成所需的所有行,然后使用left join

SELECT i.id, ts.ts. p.amt
FROM (SELECT DISTINCT ID FROM PAYMENT) i CROSS JOIN
     TS LEFT JOIN
     PAYMENT p
     ON ts.TS = p.TS AND p.id = i.id;

这将为每个id返回365行。