Sql server 如何根据一条记录上的失败条件消除所有分组记录

Sql server 如何根据一条记录上的失败条件消除所有分组记录,sql-server,Sql Server,我经常遇到这样一个问题:需要的查询不仅要删除一条不符合条件的记录,还要删除基于其他分组的所有记录。例如,对于具有以下内容的表: Name ProdType Prod Spoiled DateReceived Jack Fruit Apple N 1/1/2019 Jack Fruit Pear Y 1/1/2018 Jack Fruit Orange N

我经常遇到这样一个问题:需要的查询不仅要删除一条不符合条件的记录,还要删除基于其他分组的所有记录。例如,对于具有以下内容的表:

Name     ProdType   Prod   Spoiled     DateReceived  
Jack     Fruit      Apple   N          1/1/2019
Jack     Fruit      Pear    Y          1/1/2018
Jack     Fruit      Orange  N          1/1/2019
Jack     Vegetable  Okra    N          1/1/2019
Jack     Vegetable  Squash  N          1/1/2018
Jill     Fruit      Apple   N          4/1/2019
Jill     Fruit      Cherry  N          4/1/2019
Jill     Vegetable  Corn    Y          4/1/2019
Jill     Vegetable  Okra    N          4/1/2019
我的问题可能是寻找谁吃了什么水果,而这些水果都没有变质

到目前为止,我一直在使用嵌套的select语句,但随着我添加条件,它变得越来越困难

SELECT NAME
    ,PRODTYPE
    ,PROD
    ,SPOILED
    ,DATEREC
FROM inventory
WHERE NAME in (
    SELECT DISTINCT Name from (SELECT Name FROM inventory
                WHERE ProdType = 'fruit' as Data)

    WHERE Name NOT IN (SELECT Name from inventory WHERE Name in (
            SELECT Name 
            WHERE Spoiled = 'Y'))
    )
在Jack和Jill的示例中,我的查询将为Jill返回2个结果(每个水果返回1个),而为Jack返回一个结果

通常至少涉及两个表。我在添加条件时遇到了一些问题(通常没有结果,或者我甚至无法通过错误来运行查询),例如,如果在X日期之前收到了条件,并且在添加其他表时,如果条件被破坏了,也可以

这种嵌套选择的方法是创建列表,然后进行搜索,还是SQL提供了更好的方法

谢谢。

不存在:

select i.* 
from inventory i
where 
  i.prodtype = 'Fruit' and
  not exists (
    select 1 from inventory
    where name = i.name and
    prodtype = 'Fruit' and
    spoiled = 'Y'
  )
不存在以下情况:

select i.* 
from inventory i
where 
  i.prodtype = 'Fruit' and
  not exists (
    select 1 from inventory
    where name = i.name and
    prodtype = 'Fruit' and
    spoiled = 'Y'
  )

有许多创造性的方法可以用SQL表示查询。您的示例也可以通过这种方式实现,例如:

SELECT
    name,
    prodtype,
    prod,
    spoiled,
    daterec
FROM
    inventory
WHERE
    prodtype = 'Fruit' AND
    name NOT IN (SELECT name
                 FROM inventory
                 WHERE prodtype = 'Fruit' AND spoiled = 'Y')

要确定正确的(或至少是可以接受的)道路需要大量的练习。对于特定的数据请求,通常没有“标准”解决方案。在某些情况下,如果某个需求发生了变化,而该变化不适合现有的查询结构,则完全需要重新设计/重写查询。

有许多创造性的方法可以用SQL表达查询。您的示例也可以通过这种方式实现,例如:

SELECT
    name,
    prodtype,
    prod,
    spoiled,
    daterec
FROM
    inventory
WHERE
    prodtype = 'Fruit' AND
    name NOT IN (SELECT name
                 FROM inventory
                 WHERE prodtype = 'Fruit' AND spoiled = 'Y')

要确定正确的(或至少是可以接受的)道路需要大量的练习。对于特定的数据请求,通常没有“标准”解决方案。在某些情况下,如果单个需求发生变化,而该变化不适合现有的查询结构,则您完全需要重新设计/重写查询。

请添加预期输出示例数据的预期结果是什么?对不起,我的问题中隐藏了这一点,但是我预计Jill的两种水果的结果都是2条记录,因为两种水果都没有变质。请添加预期输出您希望样本数据的结果是什么?对不起,这是我的问题,但我预计Jill的结果是她吃的两种水果各有两个记录,因为两种水果都没有变质。你还需要关联
Prod
,我想为什么?所有输入“水果”的行都将被返回。是的,在二读时,我想你不会这样做。我以为这样做的目的是为了让那个人回到没有那种变质水果的地方。但这并不正确,我很兴奋能尝试这个。我会让你知道发生了什么。你还需要关联
Prod
,我想为什么?所有输入“水果”的行都将被返回。是的,在二读时,我想你不会这样做。我以为这样做的目的是为了让那个人回到没有那种变质水果的地方。但这并不正确,我很兴奋能尝试这个。我会告诉你发生了什么。