2

我有两张桌子

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 值加上所有匹配项的额外行?

4

3 回答 3

4
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

SQL Fiddle 上的实时示例。

于 2012-11-07T14:30:46.783 回答
2

除了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
于 2012-11-07T14:45:39.653 回答
1

由于每次连接都会成功,我们可以切换到完全/内部连接:

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 的评论,您需要所有BNULL

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
于 2012-11-07T14:35:08.417 回答