SQL替代使用WHERE作为子查询

时间:2016-03-04 02:35:10

标签: sql postgresql

我正在使用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,但到目前为止我的尝试都失败了。有没有一种简单的方法来加速这个查询?

2 个答案:

答案 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