我很难弄清楚如何提出这个问题,所以我将直接进入示例代码。假设我有这些表格:
create table Item
(
ItemId int identity(1,1),
Name nvarchar(256)
)
create table ItemSale
(
ItemSaleId int identity(1,1),
ItemId int,
Price decimal,
CategoryId tinyint
)
我想要检索的是不在给定ItemSale
中的CategoryId
条记录列表。至少对我来说,复杂性是,如果某个ItemSale
Item
中存在记录,我不希望看到Item
的任何记录。
所以,如果我有这些数据:
insert into Item(Name)
select N'Widget' union all
select N'Foo' union all
select N'Buzz'
insert into ItemSale(ItemId, Price, CategoryId)
select 1, 9.95, 1 union all
select 1, 19.95, 2 union all
select 3, 99.99, 3
我要过滤的CategoryId
是1,然后我不想看到ItemId
1(“Widget”)的任何记录。因此,使用该示例数据,我只会看到ID为ItemSale
的{{1}}记录。
我知道我的解决方案很可能涉及某种Item
或NOT EXISTS
,但我正在努力过滤掉所有记录而不仅仅是符合我标准的特定记录。我错过了什么?
SQLFiddle:http://sqlfiddle.com/#!3/79c58
答案 0 :(得分:3)
我可能过度简化您的问题,但我认为这样可行:
SELECT *
FROM ItemSale i
WHERE NOT EXISTS
( SELECT 1
FROM ItemSale i2
WHERE i.ItemID = i2.ItemID
AND i2.CategoryID = 1
);
<强> Example on SQL Fiddle 强>