Sql 为什么我不能在这个查询中使用WITH(公共表表达式)?
这只是一个SSCCE: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条件
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,我只是想说明当一个人可能需要多次引用表达式时的情况。