0

我有一个反复出现的问题,即需要不仅消除一条不符合条件的记录,而且消除基于其他分组的所有记录的查询。例如,对于具有以下内容的表:

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 提供更好的东西?

谢谢。

4

2 回答 2

1

不存在:

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'
  )
于 2019-04-05T18:33:47.117 回答
1

有许多创造性的方法可以用 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')

要确定正确的(或至少是可接受的)方式,需要大量的锻炼。对于某个数据请求,通常没有“标准”解决方案。如果单个需求更改不适合现有查询结构,则将存在您完全需要重新设计/重写查询的情况。

于 2019-04-05T18:46:23.103 回答