【问题标题】:What is the most efficient way of selecting data from relational database?从关系数据库中选择数据的最有效方法是什么?
【发布时间】:2020-03-28 20:40:03
【问题描述】:

我刚开始使用数据库和 我有来自 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')
                                )
                            )
                        )
                    )
                )
            )
        )
    )
)

我确定一定有我遗漏的东西。

【问题讨论】:

  • 提示:JOIN。和JOIN 再次。
  • 即使使用连接查询也会很昂贵。而且,PostgreSQL 不会自动创建索引来搜索子行的外键:您需要手动创建它们。

标签: sql postgresql


【解决方案1】:

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

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,这样您就不会在结果中出现重复项,因为所有这些连接都会为每个类别返回许多行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2022-08-13
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    相关资源
    最近更新 更多