编辑(求助):交叉加入。其中一个加入你直到你需要它才会使用。谢谢你的帮助
左表: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
答案 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行。