让我们考虑一下下表-

ID Score
1  95

2  100

3  88

4  100

5  73


我是一个SQL新手,但是我该如何返回同时具有ID 2和ID 4的成绩?
所以应该返回ID 100,因为它同时在ID 2和ID 4中显示

#1 楼

这是“组内集”查询的示例。我建议使用having子句进行汇总,因为这是最灵活的方法。

select score
from t
group by score
having sum(id = 2) > 0 and -- has id = 2
       sum(id = 4) > 0     -- has id = 4


这样做是按照得分进行汇总。然后,having子句的第一部分(sum(id = 2))计算每个分数有多少个“ 2”。第二个是计算多少个“ 4”。仅返回分数为“ 2”和“ 4”的分数。

#2 楼

SELECT score
FROM t
WHERE id in (2, 4)
HAVING COUNT(*) = 2 /* replace this with the number of IDs */


选择ID为2和4的行。HAVING子句确保我们找到了这两行;如果缺少任何一个,则计数将小于2。

假设id是唯一列。

评论


在更一般的情况下,当不能保证id唯一时,我们可以使用COUNT(DISTINCT id)代替COUNT(*)。

–spencer7593
2015年7月9日在21:00

是的,但是以我的经验,这种模式的几乎所有使用都涉及唯一的列。

– Barmar
2015年7月9日在21:01

#3 楼

select Score
from tbl a
where a.ID = 2 -- based off Score with ID = 2
    --include Score only if it exists with ID 6 also
    and exists (
        select 1
        from tbl b
        where b.Score = a.Score and b.ID = 6
    )
    -- optional?  ignore Score that exists with other ids as well
    and not exists (
        select 1
        from tbl c
        where c.Score = a.Score and c.ID not in (2, 6)
    )