AND查询m到n表

时间:2013-08-18 16:20:45

标签: sql database layout sqlite

我在数据库中有一个简单的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但似乎只有在列以某种方式存在时才会返回。它是根本可能的,还是我应该有不同的表格布局?

3 个答案:

答案 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

SQL Fiddle

如果您有保证(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。

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