首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从关系数据库中选择数据的最有效方法是什么?

问从关系数据库中选择数据的最有效方法是什么?
EN

Stack Overflow用户
提问于 2020-03-28 12:20:53
回答 1查看 247关注 0票数 0

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

哪个图表如下所示:

​

我想找到所有租用的电影类别,例如加拿大。在SELECT中是否有一种不用SELECT的方法。这样的声明:

代码语言:javascript
复制
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')
                                )
                            )
                        )
                    )
                )
            )
        )
    )
)

我肯定我遗漏了什么东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-28 12:40:03

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

代码语言:javascript
复制
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,这样就不会在结果中得到重复的结果,因为所有这些联接都将为每个类别返回许多行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60901062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档