没有匹配条件的查找记录

3
我知道标题有点模糊,这个问题可能已经被问过了,但我不知道该如何总结我的问题,以便能够搜索它或写出更好的标题! 这可能很简单,但它一直出现在我的问题中,我想不通。 这里举个例子:
假设我有这个表格“午餐”:
如果我想查询所有午餐时吃苹果的人,很容易,我只需使用
SELECT [Name] FROM [Lunch] WHERE [Lunch Item] = 'Apple' GROUP BY [Name]

但是如果我想获取那些午餐没有吃苹果的人员名单怎么办?如果我使用以下代码:

SELECT [Name] FROM [Lunch] WHERE [Lunch Item] <> 'Apple' GROUP BY [Name]

搜索结果仍将包括那些有苹果的人,因为他们同时也有其他不是苹果的东西。

我觉得这应该是一个简单的查询,但我不知道语法应该是什么。

6个回答

2

我更喜欢使用聚合来解决这些问题:

select [name]
from lunch
group by name
having sum(case when [lunch item] = 'Apple' then 1 else 0 end) = 0;

这个结构是非常通用的。如果你想要拥有苹果和葡萄,但不想要橙子的人,你可以这样做:

select [name]
from lunch
group by name
having sum(case when [lunch item] = 'Apple' then 1 else 0 end) > 0 and
       sum(case when [lunch item] = 'Oranges' then 1 else 0 end) > 0 and
       sum(case when [lunch item] = 'Grapes' then 1 else 0 end) = 0

由于某种原因,我无法使其工作。我理解其背后的原理,但当我尝试在SELECT语句中使用COUNT或在CASE子句中使用LIKE时,它似乎会破坏它。例如,我该如何修改才能返回没有午餐含有字母“pple”的人数? - Philip Stratford
不,我撤回之前的话。我成功地运行了你给的第一个例子,但是如果我把SELECT语句改成SELECT COUNT,它就会返回NULL。真想不通为什么! - Philip Stratford

2
如果您有一个人员表:
SELECT  *
FROM    people
WHERE   name NOT IN
        (
        SELECT  name
        FROM    lunch
        WHERE   lunchItem = 'apple'
        )

如果您没有:

SELECT  name
FROM    lunch
EXCEPT
SELECT  name
FROM    lunch
WHERE   lunchItem = 'apple'

这个应该是SELECT DISTINCT name吧?还是EXCEPT会在第一个查询中去重? - Frank Schmitt
我的实际场景确实涉及两个表,第一个示例看起来正是我所需要的,但我无法使其工作。查询解析正常,但没有返回结果。 - Philip Stratford
@FrankSchmitt:EXCEPT 可以去除重复项。 - Quassnoi
@PhilipStratford:可能你的模型里的人都喜欢苹果? - Quassnoi

1

如果您想使用 group by 子句,请使用类似于此的内容。如果您只想要人员列表,还有许多其他方法。

SELECT [Name]
FROM [Lunch]
GROUP BY [Name]
HAVING SUM(CASE WHEN [Lunch Item] = 'Apple' then 1 else 0 end) = 0 --people who had a total amount of 0 apples for lunch

1
这是第三种方法,因为为什么不呢!
SELECT DISTINCT Name 
FROM Lunch L
WHERE NOT EXISTS (SELECT 1 FROM Lunch WHERE Name = L.Name AND [Lunch Item] = 'Apple')

1
使用“NOT EXISTS”方法
SELECT  *
FROM    Lunch a
WHERE   NOT EXISTS
(
    SELECT  1
    FROM    Lunch b
    WHERE   a.Name = b.Name AND
            b.Item = 'Apple'
)

0

使用 NOT IN 运算符来排除所有拥有苹果的人。

SELECT * FROM Lunch
WHERE Name NOT IN ( SELECT Name
                    FROM Lunch
                    WHERE LunchItem ="Apple"
                   )

我认为不需要使用GROUP BY子句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接