sql - 从关系数据库中选择数据的最有效方法是什么?
问题描述
我刚开始使用数据库,我从 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')
)
)
)
)
)
)
)
)
)
我敢肯定一定有什么我错过了。
解决方案
正确的方法是使用连接而不是所有这些嵌套子查询:
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
推荐阅读
- sql - 获取最后插入的 id 作为多插入的一部分?
- powershell - Password Generator - Generate password on demand
- jquery - 不刷新使用Ajax和node js从SQL数据库获取数据
- visual-studio - 如何从同一个解决方案运行多个 Web API?
- php - 在 Laravel 5.6 中添加 GELF 记录器后出现“您的配置文件不可序列化”错误消息
- python-3.x - 如何通过 Selenium 在 Chrome 浏览器中使用 Tor
- javascript - 使用 URL 哈希删除特定 div 上的活动类
- git - 使用 Git 提交后的缩进问题
- javascript - 将 Firestore 文件分配给变量,并在 HTML-Angualr 7 中显示
- vb.net - 编译器的变化?