2016-11-22 92 views
1

我想根据左表连接这两个表并匹配行值。右表不一定包含左表中的所有ITEMNUM。并不是每个VNDITNUM都会在左边的表中有一个ITEMNUM使用sql连接两个表

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

它是SQL-Server还是MySQL?数据库名称'dbo'通常是SQL-Server,那么为什么你有'mysql'标签? – Barmar

+0

@Barmar SQL-Server。对不起,出于某种原因,我正在考虑SQL-Server的语言是MySql – Adjit

回答

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 
+0

似乎这样做了,但由于某种原因,我的输出现在在558行vs 559 ...将做更多的研究,为什么会发生这种情况。预测将左连接变为内连接的原因是什么? – Adjit

+0

如果您在Where子句中的Right表中查找值。这会导致内部连接。 –

+0

好的......我认为有人在同一时间在前端进行了修改,这导致了一些问题。但现在行数相等。感谢您的帮助 – Adjit

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

+1

添加关键字OUTER没有任何效果都没有对这个查询的输出 –

+0

什么 'cogs.ITEMNMBR, vin.VNDITNUM FROM METRO.dbo.IV00101嵌齿 LEFT OUTER JOIN METRO.dbo.IV00103 VIN 上VIN .ITEMNMBR = cogs.ITEMNMBR WHERE cogs.IVCOGSIX = 137 AND(vin.VENDORID ='90505EP'或vin.VENDORID IS NULL)' – Freak78

1

为了解释发生了什么事,基本上是SQL Server将首先联合起来的表,然后运行其中条款(结果稍微复杂一些,但这是它工作的一般方式)。您最初运行它的WHERE子句将删除任何没有vin.VENDORID = '90505EP'的东西,从结果集中删除空值。并返回一个内部连接的结果。

@ SeanLange的回答解决了这个问题通过移动过滤器上VENDORID到加入条款,本质上说“过滤器dbo.IV00103其中VENDORID =“90505EP然后左外连接该结果”

我打电话(和已经看到它之前称之为)作为意外内连接。

+0

感谢您的解释。绝对有帮助。 – Adjit