我正在尝试根据左表加入这两个表并匹配行值。右表不一定具有左表中的所有ITEMNUM
。并非每个VNDITNUM
都会在左侧表格中显示ITEMNUM
。
LEFT TABLE (559 rows)
--Filtered based on column IVCOGSIX = 137
SELECT
ITEMNMBR
FROM dbo.IV00101
WHERE IVCOGSIX = 137
+---------+
| ITEMNUM |
+---------+
| Item 1 |
| Item 2 |
| Item 3 |
| Item 4 |
+---------+
RIGHT TABLE (553 rows)
--Filtered based on column VENDORID = 90505EP
SELECT
ITEMNMBR,
VNDITNUM
FROM dbo.IV00103
WHERE VENDORID = '90505EP'
+---------+-------------+
| ITEMNUM | VNDITNUM |
+---------+-------------+
| Item 1 | VendorNum 1 |
| Item 2 | VendorNum 2 |
| Item 4 | VendorNum 4 |
| Item X | VendorNum 5 |
+---------+-------------+
我想要获得的输出是这个 -
JOINED TABLE (559 rows)
+---------+-------------+
| ITEMNUM | VNDITNUM |
+---------+-------------+
| Item 1 | VendorNum 1 |
| Item 2 | VendorNum 2 |
| Item 3 | NULL |
| Item 4 | VendorNum 4 |
+---------+-------------+
但是,我的查询只给了我548行,而且我不一定确定它会遗漏哪些行。
这是我当前的查询 -
SELECT
cogs.ITEMNMBR,
vin.VNDITNUM
FROM METRO.dbo.IV00101 cogs
LEFT JOIN METRO.dbo.IV00103 vin
on vin.ITEMNMBR = cogs.ITEMNMBR
WHERE
cogs.IVCOGSIX = 137
AND vin.VENDORID = '90505EP'
如何连接这两个表来获取左表的559行以及右表中的任何匹配项?
答案 0 :(得分:7)
您的连接谓词vin.VENDORID ='90505EP'已有效地将您的左连接转换为内连接。
试试这个。
SELECT
cogs.ITEMNMBR,
vin.VNDITNUM
FROM METRO.dbo.IV00101 cogs
LEFT JOIN METRO.dbo.IV00103 vin
on vin.ITEMNMBR = cogs.ITEMNMBR
AND vin.VENDORID = '90505EP'
WHERE
cogs.IVCOGSIX = 137
答案 1 :(得分:1)
为了解释发生了什么,基本上SQL Server将首先将表连接在一起,然后在结果上运行where子句(它比它复杂一点,但这是它的一般工作方式)。最初运行它的WHERE子句将删除任何没有vin.VENDORID = '90505EP
'的子句,从根本上剥离结果集中的空值。并返回内部联接的结果。
@ SeanLange的答案通过将VENDORID上的过滤器转换为join子句来解决这个问题,主要是说“过滤器dbo.IV00103,其中VENDORID ='90505EP,然后在该结果上留下外连接”
我打电话给(并且之前已经看过它)作为意外的内部联接。
答案 2 :(得分:-2)
您需要左外连接,因此左表将输出完整内容:
SELECT
cogs.ITEMNMBR,
vin.VNDITNUM
FROM METRO.dbo.IV00101 cogs
LEFT OUTER JOIN METRO.dbo.IV00103 vin
on vin.ITEMNMBR = cogs.ITEMNMBR
WHERE
cogs.IVCOGSIX = 137
AND vin.VENDORID = '90505EP'