我在数据库中有一个简单的m-to-n表,需要执行AND搜索。该表如下所示:
column a | column b
1 x
1 y
1 z
2 x
2 c
3 a
3 b
3 c
3 y
3 z
4 d
4 e
4 f
5 f
5 x
5 y
我希望能够说'给我列A,它在列b中有x和y(这里返回1和5),但我无法弄清楚如何形成该查询。
我尝试了SELECT column_a FROM table WHERE column_b = x AND columb_b = y
但似乎只有在列以某种方式存在时才会返回。它是根本可能的,还是我应该有不同的表格布局?
答案 0 :(得分:1)
这是“set-within-sets”子查询的示例。我喜欢使用group by
并将逻辑放在having
子句中:
select column_a
from table
group by column_a
having sum(case when column_b = x then 1 else 0 end) > 0 and
sum(case when column_b = y then 1 else 0 end) > 0;
sum()
子句中的每个having
都计算与其中一个条件匹配的行数。
事实证明这很普遍。因此,您只需添加一个子句即可检查z
:
select column_a
from table
group by column_a
having sum(case when column_b = x then 1 else 0 end) > 0 and
sum(case when column_b = y then 1 else 0 end) > 0 and
sum(case when column_b = z then 1 else 0 end) > 0;
或者,使用or
代替and
使其成为“x”或“y”:
select column_a
from table
group by column_a
having sum(case when column_b = x then 1 else 0 end) > 0 or
sum(case when column_b = y then 1 else 0 end) > 0;
答案 1 :(得分:1)
这是一种方式:
SELECT a
FROM Table1
WHERE b IN ('x', 'y')
GROUP BY a
HAVING COUNT(DISTINCT(b)) = 2
如果您有保证(a,b)是唯一的,您也可以摆脱DISTINCT。
答案 2 :(得分:0)
从根本上可能吗?是。了解原因的最简单方法是使用INTERSECT查看快速而肮脏的解决方案:
select a from your_table where b = 'x'
intersect
select a from your_table where b = 'y'
第一个句子返回1,2和5;第二个返回1,3和5。
但是,在实践中,最好使用分组,就像在其他答案中一样。