我想得到 All actors that haven't appeared in R rated films
这很容易处理 sub-queries
```
select *
from actor
where actor_id not in
(select actor_id
from actor
inner join film_actor using (actor_id)
inner join film using (film_id)
where rating = 'R');
我不能和你一起做这件事 `joins` -
到现在为止我都是这么做的-
select distinct(a.actor_id), a.first_name, a.last_name
from actor as a
left join
(film_actor as fa
inner join film as f
on fa.film_id = f.film_id)
on a.actor_id = fa.actor_id
where f.rating = 'R'
order by actor_id
在上面的查询中,我得到了所有在 `R` 分级电影,但现在我不知道如何获得 `non R` 分级影片
有人能帮我做这个吗?
2条答案
按热度按时间x0fgdtte1#
WHERE
子句在联接之后应用。事实是你的
LEFT JOIN
实际上已经回到了一个INNER JOIN
:-那个
LEFT JOIN
返回一些带有NULL
s-那个
WHERE
条款不包括NULL
s相反,您必须过滤到
R
上映前的电影JOIN
在演员桌上。这个
DISTINCT
也不需要,连接是1个演员到0个电影,所以没有复制。而且,我觉得你的风格很难理解。试着把东西隔开一点,让缩进的程度保持一致?
最后,
NOT EXISTS
通常比NOT IN
对于这些情况(反半联接)。inn6fuwd2#
所以,如果你知道如何找到r级影片中的所有演员,那么sql减法是一个很好的解决方案。选择所有参与者减去选择r级文件中的所有参与者。