我是新来编写SQL查询和我陷入一些简单的人,我需要找到drinkers who only like bud
非单调SQL查询
对于第一种:
SELECT drinker
FROM likes
WHERE beer = 'Bud';
喜欢(饮酒,啤酒)
我知道上面的查询会返回每个喜欢花蕾的饮酒者,我无法过渡到每个饮者,只有只有喜欢芽。
我是新来编写SQL查询和我陷入一些简单的人,我需要找到drinkers who only like bud
非单调SQL查询
对于第一种:
SELECT drinker
FROM likes
WHERE beer = 'Bud';
喜欢(饮酒,啤酒)
我知道上面的查询会返回每个喜欢花蕾的饮酒者,我无法过渡到每个饮者,只有只有喜欢芽。
有很多方法可以解决这个问题。我更喜欢使用与子查询的一个,因为在这种情况下,子查询不拉的实际数据,因此它是快速:
SELECT drinker
FROM likes l1
WHERE beer = 'Bud'
AND NOT EXISTS (SELECT 1 FROM likes l2 WHERE l2.drinker=l1.drinker and l2.beer <> "Bud");
什么它几乎做的是,它会选择那些饮酒者,像芽和TGEN检查如果那些喜欢别的。如果没有记录与子查询中的条件匹配,则not exists
返回true。
为了您的饮酒者,只有像花蕾:
SELECT a.DRINKER
FROM (SELECT DRINKER
FROM LIKES
WHERE BEER = 'BUD') a
INNER JOIN (SELECT DRINKER, COUNT(*)
FROM LIKES
GROUP BY DRINKER
HAVING COUNT(*) = 1) b
ON b.DRINKER = a.DRINKER
第一子查询(a)为您的查询其拉回到大家谁喜欢芽。第二个子查询(b)返回所有只喜欢一件事的饮酒者。加入他们会让你只喜欢Bud的饮酒者。
祝你好运。
另一种解决方案访问表只有一次,如果这两个最小值和最大值是相同的,只有一个值:
SELECT drinker
FROM likes
GROUP BY drinker
HAVING MIN(beer) = 'Bud'
AND MAX(beer) = 'Bud';
你不应该问2个不同的问题,在一个职位。有可能第一个问题的答案非常好,但第二个问题的答案并不好,另一个问题反过来也是如此。 – Shadow
@Shadow编辑后 – bkennedy
你只需要确定'HAVING'只有1个喜欢 – Serpiton