3

我知道这个标题是模棱两可的,这个问题之前可能已经被问过,但我不知道如何总结我的问题以便能够搜索它或写一个更好的标题!这可能很简单,但它不断出现,我无法理解它。所以这里有一个例子:

假设我有这张桌子Lunch

谁中午吃了什么?

如果我想查询午餐时吃苹果的每个人,这很容易,我只需使用

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

但是,如果我想得到一份午餐没有苹果的人的名单怎么办?如果我使用

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

结果仍将包括确实有苹果的人,因为他们也有其他不是苹果的东西。

正如我所说,我觉得这一定是一个简单的查询,但我不知道语法是什么。

4

6 回答 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
于 2013-04-23T13:50:53.140 回答
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'
于 2013-04-23T13:50:56.080 回答
1

这是第三种方法,因为为什么不呢!

SELECT DISTINCT Name 
FROM Lunch L
WHERE NOT EXISTS (SELECT 1 FROM Lunch WHERE Name = L.Name AND [Lunch Item] = 'Apple')
于 2013-04-23T13:52:37.397 回答
1

使用NOT EXISTS方法

SELECT  *
FROM    Lunch a
WHERE   NOT EXISTS
(
    SELECT  1
    FROM    Lunch b
    WHERE   a.Name = b.Name AND
            b.Item = 'Apple'
)
于 2013-04-23T13:53:36.980 回答
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
于 2013-04-23T13:51:58.753 回答
0

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

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

我不认为GROUP BY条款是必需的。

于 2013-04-23T13:55:34.047 回答