使用WITH会导致另一个查询

时间:2019-07-07 20:37:53

标签: sql postgresql

我正在尝试通过WITH存储查询的结果,然后将其结果用于另一个查询,如下所示:

WITH results AS (
    SELECT
        date,
        value
    FROM fruits
    WHERE fruit_name = 'apple'
    LIMIT 1
)
SELECT 
    date,
    quantity,
    CASE
        WHEN fruits.date < results.date THEN fruits.quantity * results.value
        ELSE 0
        END AS "valueColumn"
FROM fruits;

我正在尝试在此查询中生成一个名为valueColumn的新列。但是要这样做,我需要使用results中的信息。

上面编写的查询给我一个missing FROM-clause entry for table "results"错误。在查询中如何使用results中的信息?

1 个答案:

答案 0 :(得分:1)

results就像一张桌子。您必须将其包含在FROM子句中才能使用。在这种情况下,它只有一行,因此CROSS JOIN就足够了:

WITH results AS (
      SELECT date, value
      FROM fruits
      WHERE fruit_name = 'apple'
      LIMIT 1
     )
SELECT f.date, f.quantity,
       (CASE WHEN f.date < r.date THEN f.quantity * r.value
             ELSE 0
        END) AS "valueColumn"
FROM fruits f CROSS JOIN
     results r;

我认为您的问题专门针对CTE。有更简单的方法来表达此查询。例如,您可以使用窗口功能。假设'apple'有一行:

SELECT f.date, f.quantity,
       (CASE WHEN f.date < MAX(f.date) FILTER (WHERE f.fruit_name = 'apple') OVER ()
             THEN f.quantity * MAX(f.value) FILTER (WHERE f.fruit_name = 'apple') OVER ()
             ELSE 0
        END) AS "valueColumn"
FROM fruits f