2014-10-01 64 views
0

我想知道是否有更簡單的方法來編寫下面的查詢。簡而言之,查詢的結果是將泰坦尼克號贏得的所有奧斯卡獎和所有獎項包含在不同的表格中。這個腳本可以工作,但似乎令人費解。Postgres腳本更簡單的方法

SELECT title, production_year, 
COUNT(*) + (crew.c + director.c + writer.c + actor.c) AS Oscars 
FROM movie_award, 
(SELECT COUNT(*) AS c 
    FROM crew_award 
    WHERE result = 'won' 
    AND title = 'Titanic' 
    AND award_name = 'Oscar') AS crew, 
(SELECT COUNT(*) AS c 
    FROM director_award 
    WHERE result = 'won' 
    AND title = 'Titanic' 
    AND award_name = 'Oscar') AS director, 
(SELECT COUNT(*) AS c 
    FROM writer_award 
    WHERE result = 'won' 
    AND title = 'Titanic' 
    AND award_name = 'Oscar') AS writer, 
(SELECT COUNT(*) AS c 
    FROM actor_award 
    WHERE result = 'won' 
    AND title = 'Titanic' 
    AND award_name = 'Oscar') AS actor 
WHERE result = 'won' 
AND title = 'Titanic' 
AND award_name = 'Oscar' 
GROUP BY crew.c, director.c, writer.c, actor.c, title, production_year; 
+1

如果您要顯示錶格和數據,它會更有用。這是從什麼地方下載的?你可以創建一個總結http://sqlfiddle.com/? – 2014-10-01 07:57:45

+0

不,我寫了它,很容易看到腳本中需要的屬性。 – 2014-10-01 08:11:04

+2

@Bob錯誤的態度。 – 2014-10-01 08:30:39

回答

1

有點難以給出一個「運行方式是」沒有看到架構的答案,但你應該能夠使用UNION ALL在一定程度上簡化了的東西,有點像;

SELECT title, production_year, COUNT(*) Oscars 
FROM ( 
    SELECT title, production_year, result, award_name FROM movie_award 
    UNION ALL 
    SELECT title, production_year, result, award_name FROM crew_award 
    UNION ALL 
    SELECT title, production_year, result, award_name FROM director_award 
    UNION ALL 
    SELECT title, production_year, result, award_name FROM writer_award 
    UNION ALL 
    SELECT title, production_year, result, award_name FROM actor_award 
)z 
WHERE result = 'won' AND title = 'Titanic' AND award_name = 'Oscar' 
GROUP BY title, production_year; 
+1

謝謝,工作過一次:D – 2014-10-01 09:53:02