一对多关系中不存在的地方

时间:2014-04-14 16:15:21

标签: sql sql-server tsql sql-server-2008-r2

我很难弄清楚如何提出这个问题,所以我将直接进入示例代码。假设我有这些表格:

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}}记录。

我知道我的解决方案很可能涉及某种ItemNOT EXISTS,但我正在努力过滤掉所有记录而不仅仅是符合我标准的特定记录。我错过了什么?

SQLFiddle:http://sqlfiddle.com/#!3/79c58

1 个答案:

答案 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