2016-11-22 106 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