我正在尝试合并两个表格 - IV00101
和SOP30300
。 IV00101
包含我们在数据库中设置的所有部件号,而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行
请有人能告诉我如何错误地加入这两张桌子吗?
答案 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时,你只需要排除它们 - 这相当于内部连接。