2012-08-16 16 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

相关问题