显示一列的所有行,无论相关表是否没有所有项目

时间:2012-08-16 15:08:06

标签: sql-server

我有三张桌子

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

Stock表基本上是产品和股票之间的关系表。它将显示所有具有特定商店库存的产品。我能做到这一点,这就是我得到的:

商店名称: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中。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

您需要在表上使用LEFT JOIN来返回带有空值的值:

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

答案 1 :(得分: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) - 无论该产品是否有库存 - 或者不是。那些没有库存的产品会为NULL返回StockLevel,我会使用ISNULL功能捕获该产品并将其转换为no units以供展示。