作为参考,我正在研究这里概述的Sakila租赁DVD数据库(#2):http://www.ntu.edu.sg/home/ehchua/programming/sql/SampleDatabases.html
我试图找到每位演员所有科幻电影的运行时间,包括那些没有参加科幻电影的人。我对那些曾经在科幻电影中的人有正确的查询,但是我很难扩展它以包括所有演员,即使运行时为NULL。
这是我的问题:
SELECT act.first_name, act.last_name, SUM(fm.length)
FROM film fm
INNER JOIN film_actor fa ON fa.film_id = fm.film_id
INNER JOIN actor act ON fa.actor_id = act.actor_id
LEFT JOIN film_category fc ON fm.film_id = fc.film_id
LEFT JOIN category cat ON fc.category_id = cat.category_id
WHERE cat.name = 'Sci-Fi'
GROUP BY act.first_name, act.last_name
ORDER BY act.last_name ASC
这让我看到了至少有1部科幻电影的167名演员。我认为我的WHERE子句不允许NULL行,但我不知道如何修复它。
答案 0 :(得分:0)
你是对的,where子句正在左边连接的最右边...如果它为null它将被过滤掉,因为null不等于' Sci-Fi& #39 ;.想要空?告诉where语句包含它们
WHERE (cat.name = 'Sci-Fi' or cat.name is null)
答案 1 :(得分:0)
您应该将“cat.name ='Sci-Fi'作为外部联接中ON子句的一部分。
除非您的条件是在过滤空值,否则不应在WHERE子句中放置涉及外部联接表的条件,因为它会将外部联接转换为内部联接。标准属于ON子句。
SELECT act.first_name, act.last_name, SUM(fm.length)
FROM film fm
INNER JOIN film_actor fa
ON fa.film_id = fm.film_id
INNER JOIN actor act
ON fa.actor_id = act.actor_id
LEFT JOIN film_category fc
ON fm.film_id = fc.film_id
LEFT JOIN category cat
ON fc.category_id = cat.category_id
and cat.name = 'Sci-Fi'
GROUP BY act.first_name, act.last_name
ORDER BY act.last_name ASC