簡體   English   中英

為什么在此查詢中不能使用WITH(公用表表達式)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM