首页 > 解决方案 > 从关系数据库中选择数据的最有效方法是什么?

问题描述

我刚开始使用数据库,我从 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')
                                )
                            )
                        )
                    )
                )
            )
        )
    )
)

我敢肯定一定有什么我错过了。

标签: sqlpostgresql

解决方案


正确的方法是使用连接而不是所有这些嵌套子查询:

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_categoryinventory
ON
DISTINCT


推荐阅读