【问题标题】:WITH CTE query using postgresql使用 postgresql 的 WITH CTE 查询
【发布时间】:2018-09-19 18:39:06
【问题描述】:

我正在学习如何使用 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;

问题是结果不是显示每部电影片名的总数,而是单独显示每部电影片名。

【问题讨论】:

    标签: sql postgresql common-table-expression


    【解决方案1】:

    第二个 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;
    

    【讨论】:

    • 知道了,我的朋友!晶莹剔透。我会使用你的建议。非常感谢!
    【解决方案2】:

    要获得相同的结果,您必须在第二个查询中进行聚合和分组,就像在第一个查询中一样:

    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 而不是原始表格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 2022-07-17
      • 2021-04-08
      相关资源
      最近更新 更多