我刚开始使用数据库,我从PostgreSQL教程https://www.postgresqltutorial.com/postgresql-sample-database/获得了这个数据示例。
哪个图表如下所示:

我想找到所有租用的电影类别,例如加拿大。在SELECT中是否有一种不用SELECT的方法。这样的声明:
SELECT * FROM category WHERE category_id IN (
SELECT category_id FROM film_category WHERE film_id IN (
SELECT film_id FROM film WHERE film_id IN (
SELECT film_id FROM inventory WHERE inventory_id IN (
SELECT inventory_id FROM rental WHERE staff_id IN (
SELECT staff_id FROM staff WHERE store_id IN (
SELECT store_id FROM store WHERE address_id IN (
SELECT address_id FROM address WHERE city_id IN (
SELECT city_id FROM city WHERE country_id IN (
SELECT country_id FROM country WHERE country IN ('Canada')
)
)
)
)
)
)
)
)
)我肯定我遗漏了什么东西。
发布于 2020-03-28 12:40:03
正确的方法是使用接合而不是所有这些嵌套的子查询:
select distinct c.category_id, c.name
from category c
inner join film_category fc on fc.category_id = c.category_id
inner join inventory i on i.film_id = fc.film_id
inner join rental r on r.inventory_id = i.inventory_id
inner join staff s on s.staff_id = r.staff_id
inner join store sr on sr.store_id = s.store_id
inner join address a on a.address_id = sr.address_id
inner join city ct on ct.city_id = a.city_id
inner join country cr on cr.country_id = ct.country_id
where cr.country = 'Canada'对于您的需求,您必须连接9个表(比代码少1个,因为表film并不是真正需要的,因为列film_id可以直接链接表film_category和inventory )。
请注意每个表的别名,这些别名缩短了代码并使其更加可读性,以及用于链接每一对表的ON子句。
此外,还使用关键字DISTINCT,这样就不会在结果中得到重复的结果,因为所有这些联接都将为每个类别返回许多行。
https://stackoverflow.com/questions/60901062
复制相似问题