我有以下(非常简单)的表格:
| A | Z |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 5 |
现在我想通过Z过滤此表中的值,并找到与我的过滤器匹配的所有As。 Z-Filter应该像AND滤波器一样工作。以下是匹配查询的一些示例:
-- filter z= 1
-- expect a = 1,2
select a from data where z = 1;
-- filter z= 5
-- expect a = 2
select a from data where z = 5;
-- filter z= -
-- expect a = 1,2
select a from data;
现在出现了问题:我希望按z = 1和z = 5过滤
-- filter z: 1,5
-- expect a = 2
使用“in”将不给出我想要的结果。这就像说z = 1或z = 5。
select a from data where z in (1,5);
我想要一个AND-join到z-filter。我知道可以这样做:
select d1.a from data d1
left join data d2 on (d1.a = d2.a)
where d1.z = 1
and d2.z = 5;
问题是z-filter-list可以动态增长,对于每个z值,我必须添加另一个连接。所以我的问题是:有更简单的方法吗?
SQLFiddle以上示例:http://sqlfiddle.com/#!2/03d07/4
答案 0 :(得分:3)
您可以使用GROUP BY/HAVING
:
SELECT a
FROM data
WHERE z IN (1,5)
GROUP BY a
HAVING COUNT(DISTINCT z) = 2; -- NUMBER OF ITEMS IN THE IN CLAUSE
因此,虽然您说z
可以是1或5,但您的HAVING
将此限制为仅包含a
的{{1}}值。
<强> Example on SQL Fiddle 强>