我知道这个标题含糊不清,之前可能已经提出过这个问题,但我不知道如何总结我的问题,以便能够搜索或写出更好的标题!它可能很简单,但它不断出现,我无法理解它。所以这是一个例子:
我们说我有这张表Lunch
:
如果我想查询每个拥有苹果午餐的人都很容易,我只是使用
SELECT [Name] FROM [Lunch] WHERE [Lunch Item] = 'Apple' GROUP BY [Name]
但是,如果我想获得一份没有苹果午餐的人名单怎么办?如果我使用
SELECT [Name] FROM [Lunch] WHERE [Lunch Item] <> 'Apple' GROUP BY [Name]
结果仍然包括DID有苹果的人,因为他们还有其他不是苹果的东西。
正如我所说,我觉得这必须是一个简单的查询,但我不知道语法是什么。
答案 0 :(得分: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
答案 1 :(得分: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'
答案 2 :(得分: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
答案 3 :(得分:1)
这是第三种方法,因为为什么不呢!
SELECT DISTINCT Name
FROM Lunch L
WHERE NOT EXISTS (SELECT 1 FROM Lunch WHERE Name = L.Name AND [Lunch Item] = 'Apple')
答案 4 :(得分:1)
使用NOT EXISTS
方法
SELECT *
FROM Lunch a
WHERE NOT EXISTS
(
SELECT 1
FROM Lunch b
WHERE a.Name = b.Name AND
b.Item = 'Apple'
)
答案 5 :(得分:0)
使用NOT IN
运算符排除所有拥有Apple的人。
SELECT * FROM Lunch
WHERE Name NOT IN ( SELECT Name
FROM Lunch
WHERE LunchItem ="Apple"
)
我认为不需要GROUP BY
条款。