连接表以从左侧获取所有行,从右侧获取所有行,包括不匹配的行

时间:2016-10-11 20:48:15

标签: sql sql-server

我正在尝试合并两个表格 - IV00101SOP30300IV00101包含我们在数据库中设置的所有部件号,而SOP30300包含我们销售的所有订单项。如果有一个非库存商品已售出(又名IV00101},则该商品将位于SOP30300,我可以使用CSLSINDX =137检索它。我需要加入表格的是部件号,但无论部件号是否在SOP30300

,我都需要IV00101的所有行

这是我的尝试 - 但我知道它缺少一些东西,因为当我排除IV00101表时,我得到更多行返回(1575 w / o IV00101加入; 1182 w /加入)

(SELECT
        partTable.SOPNUMBE,
        partTable.LNITMSEQ,
        partTable.[Ship To Customer],
        partTable.UNITCOST,
        partTable.QUANTITY,
        partTable.CSLSINDX,
        cogsTable.ITEMNMBR,
        cogsTable.ITMSHNAM
        FROM
            (SELECT
                parts.ITEMNMBR,
                parts.SOPNUMBE,
                parts.LNITMSEQ,
                parts.ShipToName,
                parts.CNTCPRSN AS [Ship To Customer],
                parts.UNITCOST,
                parts.QUANTITY,
                parts.CSLSINDX
                FROM METRO.dbo.SOP30300 parts WHERE SOPNUMBE like 'I%' AND CSLSINDX = 137
            ) partTable

            LEFT JOIN
                (SELECT
                    cogs.ITEMNMBR,
                    cogs.ITMSHNAM
                    FROM METRO.dbo.IV00101 cogs WHERE IVCOGSIX = 137 AND ITMSHNAM <> 'TM' AND ITMSHNAM <> 'Rebate'
                )cogsTable
                ON cogsTable.ITEMNMBR = partTable.ITEMNMBR
    ) partNumbers

- 返回1182行

(SELECT
    partTable.SOPNUMBE,
    partTable.LNITMSEQ,
    partTable.[Ship To Customer],
    partTable.UNITCOST,
    partTable.QUANTITY,
    partTable.CSLSINDX,
    partTable.ITEMNMBR

    FROM
            (SELECT
                parts.ITEMNMBR,
                parts.SOPNUMBE,
                parts.LNITMSEQ,
                parts.ShipToName,
                parts.CNTCPRSN AS [Ship To Customer],
                parts.UNITCOST,
                parts.QUANTITY,
                parts.CSLSINDX
                FROM METRO.dbo.SOP30300 parts WHERE SOPNUMBE like 'I%' AND CSLSINDX = 137
            ) partTable
) partNumbers

-Returns 1575行

请有人能告诉我如何错误地加入这两张桌子吗?

1 个答案:

答案 0 :(得分:0)

左连接:

SELECT
  parts.SOPNUMBE,
  parts.LNITMSEQ,
  parts.CNTCPRSN AS [Ship To Customer],
  parts.UNITCOST,
  parts.QUANTITY,
  parts.CSLSINDX
  cogs.ITEMNMBR,
  cogs.ITMSHNAM
FROM METRO.dbo.SOP30300 parts 
LEFT JOIN METRO.dbo.IV00101 cogs ON cogs.ITEMNMBR = parts.ITEMNMBR AND cogs.IVCOGSIX = 137 AND cogs.ITMSHNAM <> 'TM' AND cogs.ITMSHNAM <> 'Rebate'
WHERE parts.SOPNUMBE like 'I%' AND parts.CSLSINDX = 137

注意,IV00101的一些要求必须在连接的ON部分,因此它们是JOIN上的过滤器而不是整个查询。如果你把它们放在WHERE中你做了一个内部连接,它会返回较少的结果。

它成为内连接的原因是因为你不能对NULL进行过滤,因此当你通常为cogs列获取null时,你只需要排除它们 - 这相当于内部连接。