从满足两个条件的列中选择相同的数据

时间:2015-02-12 15:58:00

标签: sql sql-server

我有数据表1:

+----+---------+-------+
| ID | GenreID | Title |
+----+---------+-------+
|  1 |       1 | Fox   |
|  2 |      12 | Fox   |
|  3 |       1 | Cat   |
|  4 |       4 | Cat   |
|  5 |       1 | Lion  |
|  6 |      12 | Lion  |
|  6 |       3 | Tiger |
|  5 |      12 | Tiger |
+----+---------+-------

如何获得GenreID = 1和12的Title?

我想要的结果是返回标题:FoxLion。但如果我使用IN,结果为:foxlioncattiger

2 个答案:

答案 0 :(得分:5)

由于您要返回同时包含GenreId = 1 AND GenreID = 12的行,因此您必须使用某些关系除法。该查询将使用IN子句返回具有您想要的GenreIDs的行,但您还将GROUP BYHAVING一起使用以过滤掉行有两个:

select title
from yourtable
where genreid in (1, 12)
group by title
having count(distinct genreid) = 2;

SQL Fiddle with Demo。这会返回FoxLionHAVING子句计算返回的GenreIDs的不同数量。在这种情况下,您希望它等于2,即WHERE子句中包含的ID总数。

有许多不同的方法可以获得结果,包括跳过WHERE子句并在HAVING中使用聚合函数和一些条件逻辑:

select title
from yourtable
group by title
having sum(case when GenreID = 1 then 1 else 0 end) = 1
  and sum(case when GenreID = 12 then 1 else 0 end) = 1;

请参阅SQL Fiddle with Demo

答案 1 :(得分:3)

SELECT title from [tab] where GenreId = 1
INTERSECT
SELECT title from [tab] where GenreId = 12
相关问题