LEFT JOIN - 即使你有正确的匹配,如何连接表并包含额外的行

时间:2012-11-07 14:24:08

标签: sql

我有两张桌子

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值和所有匹配项?

3 个答案:

答案 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

Live example at SQL Fiddle.

答案 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