为什么我不能在此查询中使用WITH(公用表表达式)?

Mar*_*tus 1 sql postgresql common-table-expression

这只是一个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
Run Code Online (Sandbox Code Playgroud)

PostgreSQL抱怨:

ERROR: column "max_i" does not exist
Run Code Online (Sandbox Code Playgroud)

我想这是因为max_i只有一个值,而不是一个行集,但我怎么弄,每当它们被用来在我经历复杂的查询,而不必重复子查询获得我的查询值仅一次定义?

ype*_*eᵀᴹ 5

首先,您不需要WHERE条款中的这两个条件.这i = max_id - 1就够了(如果有效的话.)

要使用CTE中的值,您必须使用(交叉)连接作为其他答案或使用此(不常见)语法:

WITH max_i AS
  ( SELECT MAX(i) FROM test )
SELECT *
FROM test
WHERE i = (TABLE max_i) - 1 ;
Run Code Online (Sandbox Code Playgroud)

SQL-Fiddle上测试