查找没有匹配标准的记录

时间:2013-04-23 13:48:44

标签: sql sql-server tsql group-by

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

我们说我有这张表Lunch

Who had what for lunch?

如果我想查询每个拥有苹果午餐的人都很容易,我只是使用

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

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

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

结果仍然包括DID有苹果的人,因为他们还有其他不是苹果的东西。

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

6 个答案:

答案 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条款。