我正在使用PostgreSQL学习SQL,并且我试图修改PostgreSQL Tutorial网站中的一个查询。
原始查询是:
SELECT film_id, title
FROM film
WHERE film_id IN (
SELECT inventory.film_id
FROM rental
INNER JOIN inventory ON inventory.inventory_id = rental.inventory_id
WHERE return_date BETWEEN '2005-05-29' AND '2005-05-30'
);
这有效,但是我想在输出中包含rental.return_date。我能够使用以下修改来实现这一点,但它非常慢(需要46096ms而不是40ms):
SELECT film_id, title, return_date
FROM film, rental
WHERE film_id IN (
SELECT inventory.film_id
FROM rental
INNER JOIN inventory ON inventory.inventory_id = rental.inventory_id
WHERE return_date BETWEEN '2005-05-29' AND '2005-05-30'
)
ORDER BY return_date;
我在这个网站上搜索过,我怀疑我需要将WHERE子句更改为INNER JOIN,但到目前为止我的尝试都失败了。有没有一种简单的方法来加速这个查询?
答案 0 :(得分:5)
你根本不需要子查询。
只需加入表格,这似乎是加入表格的唯一逻辑方式,然后借用前一个子查询中的where子句作为查询的where子句。
SELECT film.film_id, film.title, rental.return_date
FROM film
INNER JOIN inventory ON inventory.film_id = film.film_id
INNER JOIN rental ON rental.inventory_id = inventory.inventory_id
WHERE rental.return_date BETWEEN '2005-05-29' AND '2005-05-30'
ORDER BY rental.return_date
答案 1 :(得分:0)
只是为了让它更小......
SELECT f.film_id, f.title, r.return_date
FROM film f
INNER JOIN inventory i USING (film_id)
INNER JOIN rental r USING (inventory_id)
WHERE r.return_date BETWEEN '2005-05-29' AND '2005-05-30'
ORDER BY r.return_date