【问题标题】:How do I get All actors that haven't appeared in R rated films我如何获得所有未出现在 R 级电影中的演员
【发布时间】:2020-06-01 09:27:09
【问题描述】:

我想得到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 评级电影

有人可以帮我做这个吗?

【问题讨论】:

  • 不确定还需要什么信息?谁要求关闭它,如果您能评论并询问它会有所帮助吗?
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。
  • 为什么film 和actor 中有INT4,而film_actor 中有INT2?
  • @philipxy 我很清楚...
  • @Gautam 。 . .我删除了不一致的数据库标签。只标记您真正使用的数据库。

标签: sql join subquery


【解决方案1】:

WHERE 子句在 连接之后应用。

这里的暗示是您的LEFT JOIN 已有效地转回INNER JOIN:
- LEFT JOIN 返回一些带有NULLs 的记录
- WHERE 子句不包括 NULLs

相反,您必须过滤到R评级的电影之前JOIN演员表。

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
         and f.rating = 'R')         -- R Rating filter here
  on a.actor_id = fa.actor_id
  where f.film_id IS NULL            -- where the actor does NOT map to such films
  order by actor_id

DISTINCT 也不应该是必需的,加入是 1 个演员到 0 部电影,所以没有重复。

另外,我觉得你的风格很难读懂。试着把东西分开一点,让压痕的水平保持一致?

SELECT
    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
            AND f.rating   = 'R'
)
    ON  a.actor_id = fa.actor_id
WHERE
    f.film_id IS NULL
ORDER BY
    a.actor_id

最后,NOT EXISTS 在这些情况下通常比NOT IN 快得多(反半连接)。

SELECT
    *
FROM
    actor
WHERE
    NOT EXISTS
    (
        SELECT
            *
        FROM
            film_actor
        INNER JOIN
            film
                USING (film_id)
        WHERE
                film.rating         = 'R'
            AND film_actor.actor_id = actor.id
    )

【讨论】:

  • 我不记得如何应用R Rating filter。谢谢你,这很好用。
【解决方案2】:

所以,如果你知道如何找到 R 级电影中的所有演员,那么 SQL 减法是一个很好的解决方案。 选择所有演员 减 选择 R 级文件中的所有演员。

【讨论】:

    猜你喜欢
    • 2017-04-18
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2017-01-01
    相关资源
    最近更新 更多