POSTGRESQL:来自6个表的1个查询

时间:2014-09-29 08:51:38

标签: sql postgresql

我正在尝试从6个表格中生成1个查询,这些表格显示标题,生产年份以及它在所有类别中赢得的奥斯卡总数。我之前尝试加入它们,但是在某些类别中(例如,actor_award,根本没有'Oscar'条目,而在其他表格中,例如crew_award'Oscar'被输入7次)我生成的代码不起作用,但我认为它可以作为我想要实现的伪代码。谁能帮我吗?

SELECT movie.title, movie.production_year, COUNT(actor+crew+movie+writer+director)
WHERE 

(SELECT * FROM actor_award WHERE actor_award.title = 'Titanic' AND 
(actor_award.result = 'won' or actor_award.result = 'Won') 
AND actor_award.award_name = 'Oscar') AS actor AND


(SELECT * FROM crew_award WHERE crew_award.title = 'Titanic' AND 
(crew_award.result = 'won' or crew_award.result = 'Won') 
AND crew_award.award_name = 'Oscar') AS crew AND

(SELECT * FROM movie_award WHERE movie_award.title = 'Titanic' AND 
(movie_award.result = 'won' or movie_award.result = 'Won') 
AND movie_award.award_name = 'Oscar') AS movie AND

(SELECT * FROM writer_award WHERE writer_award.title = 'Titanic' AND 
(writer_award.result = 'won' or writer_award.result = 'Won') 
AND writer_award.award_name = 'Oscar') AS writer AND

(SELECT * FROM director_award WHERE director_award.title = 'Titanic' AND 
(director_award.result = 'won' or director_award.result = 'Won') 
AND director_award.award_name = 'Oscar') AS director AND

movie.title = 'titanic' AND
movie.production_year = '1997'

GROUP BY movie.title, movie.production_year;

1 个答案:

答案 0 :(得分:0)

当您必须访问不同表的结果时Common Table Expressions(WITH查询)可以生成非常易读的查询。

WITH actors_awards as (
    SELECT count(*) as n_awards FROM actor_award
    WHERE actor_award.title = 'Titanic'
          AND (actor_award.result = 'won' or actor_award.result = 'Won')
          AND actor_award.award_name = 'Oscar'
),
crew_awards as (
    SELECT count(*) as n_awards FROM crew_award
    WHERE crew_award.title = 'Titanic'
          AND (crew_award.result = 'won' or crew_award.result = 'Won')
          AND crew_award.award_name = 'Oscar'
),
movie_awards as (
    SELECT count(*) as n_awards FROM movie_award
    WHERE movie_award.title = 'Titanic'
          AND (movie_award.result = 'won' or movie_award.result = 'Won')
          AND movie_award.award_name = 'Oscar'
),
writer_awards as (
    SELECT count(*) as n_awards FROM writer_award
    WHERE writer_award.title = 'Titanic'
          AND (writer_award.result = 'won' or writer_award.result = 'Won')
          AND writer_award.award_name = 'Oscar'
),
director_awards as (
    SELECT count(*) as n_awards FROM director_award
           WHERE director_award.title = 'Titanic'
           AND (director_award.result = 'won' or director_award.result = 'Won')
           AND director_award.award_name = 'Oscar'
)

SELECT 'titanic' as title, 
       '1997' as production_year,
       (actor_awards.n_awards + crew_awards.n_awards + movie_awards.n_awards + writer_awards.n_awards + director_awards.n_awards) as n_awards
FROM actor_awards, crew_awards, movie_awards, writer_awards, director_awards;

考虑到我没有运行查询,因此可能会出现拼写错误。