我很困惑于outer join 3表

k97glaaz  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(362)

我正在做外接三表。我的数据库是sakila数据库。

我试图得到电影标题行从来没有被租用。所以,我像这样加入三张table。

SELECT f.title
FROM film f
LEFT OUTER JOIN inventory i ON f.film_id = i.film_id
LEFT OUTER JOIN rental r ON i.inventory_id = r.inventory_id
WHERE r.rental_ID IS NULL;

它返回行,但问题是我不知道这个查询是对的还是错的。有人能帮我吗?

polkgigr

polkgigr1#

我觉得你应该使用 EXISTS 子句,因为它允许返回行或不返回行的子查询和测试is:

SELECT f.title
FROM film f
JOIN inventory i ON f.film_id = i.film_id
WHERE NOT EXISTS (
    SELECT 1
    FROM rental r 
    WHERE i.inventory_id = r.inventory_id
)
oxcyiej7

oxcyiej72#

您正在从胶片表中选择胶片。您正在加入库存和租赁。然后你保留所有的零租金。这是一种所谓的反连接(anti-join),是一种用于弱dbms模拟的技巧 NOT EXISTS 或者 NOT IN 这些数据库管理系统不能很好地运行的子句。
因此,查询将为您提供所有没有库存或有库存但没有一次租赁的电影。或者短片:没有出租的电影。没错,你所说的你想要实现的。
另一种编写查询的方法是:

select title
from film f
where not exists
(
  select *
  from inventory i
  join rentals r on r.inventory_id = i.inventory_id
  where i.film_id = f.film_id
);

相关问题