[英]why can't I use WITH (Common Table Expressions) in this query?
這只是一個SSCCE:
CREATE TABLE test(i INTEGER NOT NULL);
WITH max_i AS (SELECT MAX(i) FROM test)
SELECT * FROM test WHERE max_i - i < 2 AND max_i!=i
PostgreSQL抱怨:
ERROR: column "max_i" does not exist
我猜這是因為max_i
是單個值而不是行集,但是如何在我通過復雜查詢獲得的查詢值中僅定義一次,而不必每次使用子查詢時都重復子查詢?
首先,您不需要在WHERE
子句中同時滿足這兩個條件。 i = max_id - 1
就足夠了(如果可以的話)。
要使用CTE中的值,您要么必須使用(交叉)聯接作為其他答案,要么使用以下(較不常見)的語法:
WITH max_i AS
( SELECT MAX(i) FROM test )
SELECT *
FROM test
WHERE i = (TABLE max_i) - 1 ;
在SQL-Fiddle上測試
您在“最終”選擇語句中根本沒有引用CTE。 因此,您無法引用它。 另外, where
條件需要引用列而不是表。
在您的語句中, max_i
是“表”的名稱,因此不能在where條件中使用。
WITH t_max AS (
SELECT MAX(i) as max_i FROM test
)
SELECT *
FROM test
CROSS JOIN t_max as t
WHERE t.max_i - test.i < 2
AND t.max_i <> test.i;
cross join
沒有任何危害,因為我們知道CTE(名為t_max
)將始終僅返回單行。
一旦您可以在最終選擇中引用CTE,比較就很容易了,但是要做到這一點,您需要為CTE內部選擇的列提供別名。
我想這就是你要找的
CREATE TABLE test(i INTEGER NOT NULL);
WITH max_i AS (SELECT MAX(i) Mi FROM test)
SELECT * FROM test
JOIN max_i
on max_i.Mi - 1 = test.i;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.