我有两张桌子
Table A
-------
ID
ProductName
Table B
-------
ID
ProductID
Size
我想加入这两个表
SELECT * FROM
(SELECT * FROM A)
LEFT JOIN
(SELECT * FROM B)
ON A.ID = B.ProductID
这很容易,我会得到A中的所有行乘以B中匹配的行,如果没有匹配则为NULL字段。
但是这里有一个棘手的问题,即使有匹配项,我如何从A中获取表B的NULL字段的所有行,所以我得到一个额外的行,其中包含NULL值和所有匹配项?
答案 0 :(得分:3)
SELECT A.*
, B3.ID
, B3.ProductID
, B3.Size
FROM A
LEFT JOIN
(
SELECT ProductID as MatchID
, ID
, ProductID
, Size
FROM B
UNION ALL
SELECT ID
, null
, null
, null
FROM A A2
) B3
ON A.ID = B3.MatchID
答案 1 :(得分:1)
而不是像其他人建议的那样在子查询中使用UNION ALL
,你也可以(我会)在外层使用UNION ALL
,这样可以简化查询:
SELECT A.ID, A.ProductName, B.ID, B.Size
FROM A
INNER JOIN B
ON B.ProductID = A.ID
UNION ALL
SELECT A.ID, A.ProductName, NULL, NULL
FROM A
答案 2 :(得分:0)
由于每次加入都会成功,我们可以切换到完整/内部联接:
SELECT
*
FROM
A
INNER JOIN
(SELECT ID,ProductID,Size FROM B
UNION ALL
SELECT NULL,ID,NULL FROM A) B
ON
A.ID = B.ProductID
现在是明确切换到命名列的非常的好时机,而不是使用SELECT *
或者,如果根据@Andomar的评论,您需要B
列的所有NULL
:
SELECT
A.ID,A.ProductName,
B.ID,B.ProductID,B.Size
FROM
A
INNER JOIN
(SELECT ID,ProductID,Size,ProductID as MatchID FROM B
UNION ALL
SELECT NULL,NULL,NULL,ID FROM A) B
ON
A.ID = B.MatchID