1

我在数据库中有一个简单的 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了,但似乎只有在列以某种方式两者兼有的情况下才会返回。这从根本上是可能的,还是我应该有不同的表格布局?

4

3 回答 3

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()子句中的 eachhaving正在计算与其中一个条件匹配的行数。

事实证明这是相当普遍的。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代替将其设为“x”或“y” and

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;
于 2013-08-18T16:24:49.497 回答
1

这是一种方法:

SELECT a
FROM Table1
WHERE b IN ('x', 'y')
GROUP BY a
HAVING COUNT(DISTINCT(b)) = 2

SQL小提琴

如果您保证 (a,b) 是唯一的,您也可以摆脱 DISTINCT。

于 2013-08-18T16:27:18.897 回答
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。

但是,在实践中,最好使用分组,就像其他答案一样。

于 2013-08-18T16:26:25.290 回答