我会提前说,出于对你的时间和网站的尊重 – 这是一项家庭作业.但是,我已经考虑并编写了一个解决方案,但由于我无法成功地对其进行分析或在其他地方获得相关的第三方意见,以确定它
假设我有一个简单的电影参与信息表(人物,电影,人物与电影的关系)如下:
create table film ( person_name varchar(48) not null, film_title varchar(128) not null, relation varchar(48) not null ); -- { 'Mel Gibson', 'Braveheart', 'director' } -- { 'Mel Gibson', 'Braveheart', 'cast' } -- { 'Steven Spielberg', 'A.I.' , 'director' } -- { 'Hilary Swank', 'Million Dollar Baby', 'cast' } -- etc
数据库和表格不是由我创建或维护的,我只是从中查询信息.
我需要为他们指导的每部电影中的演员(在镜头前行动)制作一套人名.对于那些指导过至少一部他们没有采取行动的电影的人,或者那些没有指挥任何事情的人来说,情况不应该适用.
我的查询(据我可以证明,产生了正确的结果集),瞧瞧:
( select person_name from film where relation = 'director' ) except ( select person_name from ( ( select person_name, film_title from film where relation = 'director' ) except ( select person_name, film_title from film where relation = 'cast' ) ) as director_behind_camera_for_film )
我想知道查询是否合理,或者我是否一直在想这个问题?如果是后者,请您提供更好的解决方案或解释吗?
不要太注意我到处使用字符串的事实(代理键可能已经被用过了) – 这是一个简化的例子,但它仍然证明了我的挑战.
SELECT tmp.person_name FROM ( SELECT person_name, film_title, COUNT(relationship) as cnt FROM film WHERE relationship IN ('cast', 'director') GROUP BY person_name, film_title ) as tmp GROUP BY person_name HAVING SUM(cnt) = COUNT(cnt)*2
要么
SELECT tmp.person_name FROM ( SELECT person_name, film_title, COUNT(DISTINCT(relationship)) as cnt FROM film WHERE relationship IN ('cast', 'director') GROUP BY person_name, film_title ) as tmp GROUP BY person_name HAVING SUM(cnt) = COUNT(cnt)*2