С запросом CTE с использованием postgresql - PullRequest
0 голосов
/ 19 сентября 2018

Я изучаю, как использовать SQL CTE, и я хотел бы сравнить два запроса, чтобы получить один и тот же ответ (используя postgresql), но я не могу помочь, кто-то может помочь?

Я создаю этот запрос, и у меня естьитого по каждому названию фильма (база данных Sakila):

SELECT COUNT(r.rental_id) rental_count, 
    f.title as "Film"
FROM film f 
JOIN inventory i 
ON f.film_id = i.film_id
JOIN rental r USING (inventory_id) 
GROUP BY f.title
ORDER BY rental_count DESC;

Я хотел бы сделать то же самое, используя WITH (CTE), и для этого я создаю следующий код:

WITH table1 AS (           
            SELECT f.film_id,
            f.title as "Film"
            FROM film f),

 table2 AS (           
        SELECT r.inventory_id,
        COUNT(r.rental_id) rental_count,
        i.film_id,
        i.inventory_id
        FROM inventory i
        JOIN rental r USING (inventory_id)
        GROUP BY r.inventory_id, i.film_id, i.inventory_id)

SELECT *
FROM table1
JOIN table2 
ON table1.film_id = table2.film_id;

проблема заключается в том, что в результате показывается не общее название каждого фильма, а отдельное название каждого фильма.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Второй CTE должен быть сгруппирован по пленке для получения эквивалентного конечного результата.

WITH table1 AS (
    SELECT
        f.film_id
      , f.title AS "Film"
    FROM film f
    )
, table2 AS (
    SELECT
        COUNT(r.rental_id) rental_count
      , i.film_id
    FROM inventory i
    JOIN rental r ON i.inventory_id = r.inventory
    GROUP BY i.film_id
    )
SELECT
      table2.rental_count
    , table1.Film
FROM table1
JOIN table2 ON table1.film_id = table2.film_id
ORDER BY rental_count DESC;

Просто примечание;Я бы не рекомендовал использовать в одном запросе как естественные, так и неестественные типы объединения, это может привести к путанице.

SELECT
       COUNT(r.rental_id) rental_count
     , f.title AS "Film"
FROM film f
JOIN inventory i ON f.film_id = i.film_id
JOIN rental r ON i.inventory_id = r.inventory_id -- change here
GROUP BY f.title
ORDER BY rental_count DESC;
0 голосов
/ 19 сентября 2018

Чтобы получить тот же результат, вам нужно объединить и сгруппировать во втором запросе, как в первом:

WITH table1 AS (...),
     table2 AS (...)
SELECT count(table2.rental_count) AS rental_count,
       table1."Film"
FROM table1
   JOIN table2 USING (film_id)
GROUP BY table1."Film"
ORDER BY rental_count DESC;

В основном вы используете CTE вместо исходных таблиц.

...