2012-08-16 18 views
1

我有三個表顯示一列中的所有行,不管相關表中沒有的所有項目

dbo.Products (productname, price) 
dbo.Stock (productid, storeid, stocklevel) 
dbo.Store (storename) 

基本上股票表格是產品和股票之間的關係表。它會顯示所有具有該特定商店庫存的產品。這個我能做到,這就是我得到:

店鋪名稱:BeachFrontStore

Products StockLevel 
Pencil 400 units 
Bic Pen 640 units 

現在我也想補充一點,沒有股票,目前的存儲產品。這樣用戶有一個視覺反饋。 什麼,我需要做到:

店鋪名稱:BeachFrontStore

Products StockLevel 
Pencil 400 units 
Bic Pen 640 units 
Eraser 'no units' 

橡皮擦將是具有內部dbo.Stock沒有關係的產品,但確實存在於dbo.Products。

任何幫助,非常感謝!

回答

1

您需要使用您的表LEFT JOIN s到用null返回值:

select p.productname, sl.stocklevel, s.storename 
from products p 
left join stocklevel sl 
    on p.ProductID = sl.ProductID 
left join store s 
    on s.storeid = sl.storeid 

SQL Fiddle with Demo

+0

Acutally,我已經有了它,它確實有效,但由於一些非常奇怪的原因,它顯示的產品比它應該少! dboProducts中有1100種產品。但是這樣做只顯示39! – CogentP 2012-08-16 15:40:15

+0

@ user1603568你可以發佈每個表的一些示例數據嗎? – Taryn 2012-08-16 15:55:34

0

您基本上需要在產品和庫存之間獲得所有產品的OUTER JOIN,無論他們是否有 庫存。

喜歡的東西:

SELECT 
    p.ProdudctName, 
    ISNULL(s.StockLevel, 'no units') 
FROM 
    dbo.Products p 
LEFT OUTER JOIN 
    dbo.Stock s ON p.ProductID = s.ProductID 
WHERE 
    (s.StoreId = 42 OR s.StoreID IS NULL) 

這給你的產品和他們的股票 - 對於一個給定存儲(這裏:STOREID = 42) - 無論是否有該產品的股票 - 與否。那些沒有庫存的產品將返回一個NULLStockLevel,我用ISNULL函數捕獲並將其轉換爲no units進行顯示。

+0

感謝您的幫助。我已經嘗試了一個OUTERJOIN,但我注意到你在WHERE處添加了一個IS NULL。我跟着你的提示,它讓我展示了更多的產品,但沒有整桌子。我有1100個產品,只顯示39個(在ISNULL之前它只顯示8個)。我開始認爲這可能是一個配置問題,因爲簡單的邏輯告訴我這個代碼應該工作! – CogentP 2012-08-16 15:42:21

相關問題