我试图显示连续两年执导的所有董事名单。
鉴于以下数据:
Pantomime table:
Year titleID DirectorID
2000 1 1
2001 2 7
2002 3 7
2003 4 8
2004 5 9
2005 6 9
这是理想的结果:
DirectorID
7
9
这是我到目前为止所尝试的查询,但无法获得所需的结果。
SELECT directorID
FROM pantomime
where directorID = directorID+1
GROUP BY directorID
答案 0 :(得分:5)
一种方法使用exists
:
select distinct p.directorId
from pantomine p
where exists (select 1
from pantomine p2
where p2.directorId = p.directorId and p2.year = p.year + 1
);
此想法还有其他有趣的变体,例如使用in
:
select distinct p.directorId
from pantomine p
where p.year in (select p2.year + 1
from pantomine p2
where p2.directorId = p.directorId
);
这是一个完全神秘的方法,根本不使用类似连接的机制(只是聚合):
select distinct directorId
from ((select directorId, year from pantomine)
union all
(select directorId, year + 1 from pantomine)
) p
group by directorId, year
having count(*) = 2;
这也是select distinct
与group by
一起使用的非常罕见的情况之一。
答案 1 :(得分:3)
您可以使用加入来查看哪些条目具有明年的值,然后使用不同的方式获取相关的ID:
select distinct a.directorID
from Pantomime as a
inner join Pantomime as b on a.year = b.year-1
and a.directorID = b.directorID;
因为我正在使用内部加入,所以只有在b-表示year-1
出现在这个directorId
答案 2 :(得分:0)
试试这个,没有连接或子查询,只是一个简单的分组:
SELECT directorID
FROM pantomime
GROUP BY directorID
HAVING COUNT(*) = 2
AND MAX(Year) = MIN(Year) + 1
这是fiddle。