当前位置 : 主页 > 网络推广 > seo >

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

来源:互联网 收集:自由互联 发布时间:2021-06-16
我会提前说,出于对你的时间和网站的尊重 – 这是一项家庭作业.但是,我已经考虑并编写了一个解决方案,但由于我无法成功地对其进行分析或在其他地方获得相关的第三方意见,以确定它
我会提前说,出于对你的时间和网站的尊重 – 这是一项家庭作业.但是,我已经考虑并编写了一个解决方案,但由于我无法成功地对其进行分析或在其他地方获得相关的第三方意见,以确定它是否实际上是一个好的事实,我有点恼火.

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

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
网友评论