首先,这是一个家庭作业。我已经想到并写了一个解决方案,但我有点恼火,因为我无法成功地描述它或获得关于它是否真的是一个好的第二意见。
假设我有一个简单的电影参与信息表(人、电影、人与电影的关系),如下所示:
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
数据库和表不是我创建或维护的,我只是从中查询信息。
我需要为他们导演的每一部电影中的 Actor (在镜头前表演)制作一组人名。条件应该不是 适用于至少执导过一部他们没有参演过的电影的人,或者没有导演过任何电影的人。这些导演是否也与不是他们导演的电影有关系,在这里并不重要。基本上,查询可以表示为“给我列出他们所导演的每部电影中的 Actor 名单”。
我的查询(据我所知产生了正确的结果集),瞧:
(
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
关于sql - 检索以下结果集的最佳 SQL 查询是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7973559/