关于MySQL和PostgreSQL中的子查询

关于MySQL和PostgreSQL中的子查询,mysql,postgresql,Mysql,Postgresql,当我使用MySQL时,下面的查询将干净地运行 SELECT 1 as num1, (select(num1 + 1)) as num2 但是PostgreSQL返回了一个错误 ERROR: column "num1" does not exist 为什么它的响应不同?我找不到任何好的源代码,但我非常确定,该标准不要求在相关子查询中显示投影列的别名。我刚刚在SQL Server和Oracle中尝试过,他们似乎都同意PostgreSQL,拒绝在相关子查询中使用x,不管它位于外部select的哪个

当我使用MySQL时,下面的查询将干净地运行

SELECT 1 as num1, (select(num1 + 1)) as num2
但是PostgreSQL返回了一个错误

ERROR: column "num1" does not exist

为什么它的响应不同?

我找不到任何好的源代码,但我非常确定,该标准不要求在相关子查询中显示投影列的别名。我刚刚在SQL Server和Oracle中尝试过,他们似乎都同意PostgreSQL,拒绝在相关子查询中使用
x
,不管它位于外部select的哪个子句中

这类似于MySQL如何允许以下查询:

选择一个+1 x
从t
按x+1排序

但是SQLServer和Postgres没有。MySQL对于在各种子句中使用别名似乎比标准要求的更为宽容。

您应该使用PostgreSQL语法,因为PgSql不支持这种方式的子查询,请尝试以下方法

WITH tblcontent AS (SELECT 1 as num1)
SELECT num1, num1 + 1 AS num2 from tblcontent

问题不应该是为什么Postgres不支持这种语法,而是为什么MySQL支持这种语法。在大多数RDBMS中,别名只有在执行查询后才能解析,因此不能在声明别名的查询中使用别名。例如,更常见的用例-不能在声明它的查询/表元素的
where
子句中使用列别名

解决此问题的一种方法是使用子查询:

SELECT num1, num1 + 1 AS num2
FROM   (SELECT 1 AS num1) t

什么意思是
不工作
?对不起,我的意思是sql不能在PostgreSQLerror中运行错误是
错误:列“num1”不存在
MySQL也不允许在其中使用别名。是的;这是因为select if是在任何其他内容之后计算的。但是为什么不允许
选择1作为num1,num1+1作为num2