如何列出表中不存在的项目并对其进行分类

时间:2017-03-08 13:22:38

标签: sql

我遇到了障碍,这是我的问题:

我有一张桌子,我们称之为项目,其中列出了我的目录中的所有项目。 我有ItemSold,它列出了当天售出的每件商品。 我有另一个名为Sales的表,其中包含我想查询的日期。

这是我的例子:

项目表 enter image description here

已售物品 enter image description here

销售 enter image description here

找出哪天售出的商品显然是微不足道的。我的挑战是弄清楚哪一天没有售出的物品。

我试过了:

select i.itemid from items i
where i.ItemID not in ( SELECT         i.ItemID
FROM            Sales d INNER JOIN
                         ItemSold i ON d.SaleDate = i.SaleDate)

但这只能为我提供根本没有售出的物品。

我看到以下结果:

enter image description here

我正在使用MSSQL。 我附加了脚本来重新创建表和数据:

CREATE TABLE [dbo].[Items](
    [ItemID] [int] NULL
) ON [PRIMARY]

GO

CREATE TABLE [dbo].[ItemSold](
    [SaleDate] [date] NULL,
    [ItemID] [int] NULL
) ON [PRIMARY]

GO


CREATE TABLE [dbo].[Sales](
    [SaleDate] [date] NULL
) ON [PRIMARY]

GO

感谢您的帮助。这是一个非常令人困惑的问题的简化版本。

1 个答案:

答案 0 :(得分:1)

首先生成所有可能的行 - 所有日期和所有项目。然后使用left join过滤掉已售出的商品:

select i.itemid, s.saledate
from items i cross join
     sales s left join
     itemsold si
     on si.itemid = i.itemid and si.saledate = s.saledate
where si.itemid is null;