【发布时间】:2011-11-01 22:11:32
【问题描述】:
首先,这是个家庭作业。我已经想到并写了一个解决方案,但我有点恼火的是,我无法成功地对其进行分析,也无法就它是否真的是一个好的解决方案获得第二意见。
假设我有一个简单的电影参与信息表(人、电影、人与电影的关系),如下所示:
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
)
我想知道这个查询是否正确,或者我对此的想法是否完全错误?如果是后者,能否请您提供一个更好的解决方案或解释?
不要太在意我在任何地方都使用字符串(可以使用代理键)这一事实 - 这是一个简化的示例,但它仍然证明了我的挑战。
【问题讨论】:
-
只是一个小评论:没有必要将个人
SELECTs 放在括号中(无论是外部的还是内部的)
标签: sql optimization