用sql连接2个表

时间:2016-11-22 21:23:03

标签: sql sql-server

我正在尝试根据左表加入这两个表并匹配行值。右表不一定具有左表中的所有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行以及右表中的任何匹配项?

3 个答案:

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