sql - 检索以下结果集的最佳 SQL 查询是什么

标签 sql optimization

首先,这是一个家庭作业。我已经想到并写了一个解决方案,但我有点恼火,因为我无法成功地描述它或获得关于它是否真的是一个好的第二意见。

假设我有一个简单的电影参与信息表(人、电影、人与电影的关系),如下所示:

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/

相关文章:

sql - df.to_sql 连接问题,知道吗?

c - 算法 - 查找纯数字

sql - 循环遍历sql server触发器中的数据

sql - 客户想要一个像 PREFIX20100001 这样的字段

mysql - 此更新查询是否有任何可能的重写选项?

PHP 优化 - 减少内存使用

sql - PostgreSQL 性能监控工具

optimization - Mysql查询需要时间

.net - 生成 4x4x4 数独板的更好/好方法?

php - 使用 id 功能编辑产品页面