在标准SQL中,如何选择行,使得对于一列中的每个唯一值,另一列中的所有值都是指定值?

时间:2014-09-05 18:58:31

标签: sql

在标准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

(我不确定如何说出这个问题 - 关键词等等 - 所以请原谅我是否有更好的措辞会导致已经在这里发布的解决方案。)

2 个答案:

答案 0 :(得分:2)

您可以使用GROUP BYHAVING

执行此操作
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)