在标准SQL中,如何选择行,以便对于一列中的每个唯一值,另一列中的所有值都是指定值?
例如,在下表中,我想选择列c_1的所有值,其中c_s的值对于c_1的每个不同值都是“d”。因此,对于c_1 ='2',c_s的所有值都是'd'。对于c_1 ='3'也是如此。但是,对于c_1 ='1','4'或'5',情况并非如此。
这是我的表:
id | c_1 | c_2 | c_s
----+------+---------+--------
1 | 1 | 1 | d
2 | 1 | 2 |
3 | 2 | 1 | d
4 | 2 | 2 | d
5 | 2 | 3 | d
6 | 3 | 1 | d
7 | 4 | 1 | r
8 | 5 | 1 | d
9 | 5 | 2 | r
以下是我想从sql查询中返回的内容:
c_1 | c_2 | c_s
----+---+--------
2 | 1 | d
3 | 1 | d
(我不确定如何说出这个问题 - 关键词等等 - 所以请原谅我是否有更好的措辞会导致已经在这里发布的解决方案。)
答案 0 :(得分:2)
您可以使用GROUP BY
和HAVING
:
SELECT c_1
, MIN(c_2) AS c_2
, MAX(c_s) AS c_s
FROM Table1
GROUP BY c_1
HAVING MIN(CASE WHEN c_s = 'd' THEN 1 ELSE 0 END)
+ MAX(CASE WHEN c_s = 'd' THEN 1 ELSE 0 END) = 2
演示:SQL Fiddle
在您的示例输出中,您为1
选择c_2
,即使存在其他值,因此我使用MIN()
,但如果您想要选择不同的值,则可以调整逻辑
答案 1 :(得分:1)
我的答案与山羊科学家非常相似。我检查每个值的计数,并将其与D的数量进行比较。
<强> SQL Fiddle Demo 强>
select
c_1 as 'c_1',
min(c_2) as 'c_2',
min(c_s) as 'c_s'
from yourTable
group by c_1
having count(1) = sum(case when c_s = 'd' then 1 else 0 end)