Sql 如果同一组中存在另一条记录,则忽略组中的记录

Sql 如果同一组中存在另一条记录,则忽略组中的记录,sql,sql-server,tsql,subquery,Sql,Sql Server,Tsql,Subquery,我试图从一组结果中删除一条记录,如果同一组中有一条具有特定值的记录。我试图将我的复杂问题改编成一个简单的例子: DECLARE @fruits TABLE (type varchar(16), attribute varchar(16)) INSERT INTO @fruits VALUES('orange', 'juicy'); INSERT INTO @fruits VALUES('orange', 'seeds'); INSERT INTO @fruits VALUES('orange',

我试图从一组结果中删除一条记录,如果同一组中有一条具有特定值的记录。我试图将我的复杂问题改编成一个简单的例子:

DECLARE @fruits TABLE (type varchar(16), attribute varchar(16))
INSERT INTO @fruits VALUES('orange', 'juicy');
INSERT INTO @fruits VALUES('orange', 'seeds');
INSERT INTO @fruits VALUES('orange', 'pit');
INSERT INTO @fruits VALUES('apple', 'juicy');
INSERT INTO @fruits VALUES('apple', 'seeds');
INSERT INTO @fruits VALUES('apple', 'crisp');
SELECT * FROM @fruits;
假设我想从我的结果中删除任何具有
属性='pit'
的记录,如果有另一个与
属性='seeds'相同类型的结果


如何使用SQL Server 2016编写该查询?

您可以使用
note exists
和一点布尔逻辑:

select f.*
from @fruits f
where 
    attribute <> 'pit'
    or not exists (
        select 1 
        from @fruits f1 
        where f1.type = f.type and f1.attribute = 'seeds'
    )
另一种方法是使用窗口功能:

select * 
from (
    select 
        f.*, 
        max(case when attribute = 'seeds' then 1 else 0 end) over(partition by type) has_seeds
    from @fruits f
) f
where not (attribute = 'pit' and has_seeds = 1)

你试过什么?向我们展示您的尝试。
存在
可能值得探索。我接受这个答案。请注意,\@fruit应该是\@fruits,尽管在我实际查询中的exists子查询中,我当前表示为@fruits的是一个包含许多连接的复杂查询。使用Exists要求我基本上在两个点上复制整个查询……但我现在对此没有意见。@MikePugs:好的,所以您可能想改用窗口函数。请参阅我的编辑。@ MikPug,您可以考虑使用(CTE)来避免重复您的< > >水果>代码>查询。您可以定义一次复杂查询,然后对其进行多个引用。查询优化器将整个smash视为一个大查询,因此性能不会受到影响。
select * 
from (
    select 
        f.*, 
        max(case when attribute = 'seeds' then 1 else 0 end) over(partition by type) has_seeds
    from @fruits f
) f
where not (attribute = 'pit' and has_seeds = 1)