Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么我不能在这个查询中使用WITH(公共表表达式)?_Sql_Postgresql_Common Table Expression - Fatal编程技术网

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

Sql 为什么我不能在这个查询中使用WITH(公共表表达式)?,sql,postgresql,common-table-expression,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 我想这是因为max_I是一个单值而不是行集,但如何在通过复杂查询获得的查询值中只定义一次,而不必在使用子查询时重复子查询?在最终select语句中根本不引用CTE。因此,您不能引用它。此外,where条件

这只是一个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

我想这是因为max_I是一个单值而不是行集,但如何在通过复杂查询获得的查询值中只定义一次,而不必在使用子查询时重复子查询?

在最终select语句中根本不引用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;
交叉连接没有任何害处,因为我们知道名为t_max的CTE总是只返回一行


一旦可以在最终选择中引用CTE,比较就很容易了,但要做到这一点,需要为CTE内部选择的列提供别名。

在最终选择语句中根本不引用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;
交叉连接没有任何害处,因为我们知道名为t_max的CTE总是只返回一行


一旦您可以在最终选择中引用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;

我想这就是你要找的

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;

首先,在WHERE子句中不需要这两个条件。如果i=max_id-1有效的话就足够了

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

WITH max_i AS
  ( SELECT MAX(i) FROM test )
SELECT *
FROM test
WHERE i = (TABLE max_i) - 1 ;

首先,在WHERE子句中不需要这两个条件。如果i=max_id-1有效的话就足够了

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

WITH max_i AS
  ( SELECT MAX(i) FROM test )
SELECT *
FROM test
WHERE i = (TABLE max_i) - 1 ;

处进行测试。我不知道你可以使用表语法,它是select*from的缩写,也是一个标量值。关于不需要两个条件,是的,这是一个SSCCE,我只是想说明当一个人可能需要多次引用表达式时的情况。有趣。我不知道你可以使用表语法,它是select*from的简写,也是一个标量值。关于不需要两个条件,是的,这是一个SSCCE,我只是想说明当一个人可能需要多次引用表达式时的情况。