2

我有 4 个表如下,它们具有以下属性:

Actor:actor_id,firstname,lastname
film_actor:actor_id,film_id
film_category:film_id,category_id
category:category_id,name

我想找到在电影中工作的所有演员的列表,他们的 film_id、category_id 和类别名称。

我想使用 In 子句进行后续查询。所以我通过如下实现来获得o/p:

select  a.first_name,a.actor_id,fc.film_id,c.name,c.category_id
from actor a,film_actor fa,film_category fc,category c where a.actor_id 
in (select fa.film_id from film_actor fa where fa.actor_id=a.actor_id
and fa.film_id 
in (select fc.film_id  from film_category fc where fc.film_id=fa.film_id
and fc.category_id 
in(select fc.category_id from category c where c.category_id=fc.category_id)))

但是假设现在我想知道特定 category_id 的演员列表。假设 5 存在。因此,我进行了以下更改:

select  a.first_name,a.actor_id,fc.film_id,c.name,c.category_id
from actor a,film_actor fa,film_category fc,category c 
where a.actor_id in 
(select fa.film_id from film_actor fa where fa.actor_id=a.actor_id
and fa.film_id 
in (select fc.film_id  from film_category fc where fc.film_id=fa.film_id
and fc.category_id 
in(select fc.category_id from category c where c.category_id=fc.category_id
and category_id=5)))

我得到了空的结果。最后,我们什么时候应该使用 IN 子句,什么时候不应该?

4

2 回答 2

1

不要IN用于这个..JOIN改用。

select  
    a.first_name,
    a.actor_id,
    fc.film_id,
    c.name,
    c.category_id
from 
    actor a join 
    film_actor fa on fa.actor_id = a.actor_id join
    film_category fc on fc.film_id = fa.film_id join
    category c on c.category_id = fc.category_id and c.category_id = 5

我通常只IN用于一组硬编码的 ID……JOINEXISTS其他所有情况。这不仅更清洁,而且还可能会产生更好的执行计划。

于 2013-01-10T22:31:21.380 回答
1

请开始使用连接语法而不是IN子句:

select a.first_name,
  a.actor_id,
  fc.film_id,
  c.name,
  c.category_id
from actor a
left join film_actor fa
  on a.actor_id = fa.actor_id
left join film_category fc
  fa.film_id = fc.film_id
left join category c 
  on fc.category_id = c.category_id
  and c.category_id=5

这将返回表中的所有记录,actor无论其他表中是否存在匹配记录。

如果您在学习JOIN语法方面需要帮助,这里有一个很好的连接可视化解释

于 2013-01-10T22:31:41.700 回答