关于MySQL和PostgreSQL中的子查询

时间:2015-05-27 05:41:13

标签: mysql postgresql

当我使用MySQL时,以下查询运行干净。

SELECT 1 as num1, (select(num1 + 1)) as num2

但PostgreSQL返回错误。

ERROR: column "num1" does not exist

为什么它的反应不同?

3 个答案:

答案 0 :(得分:4)

问题不应该是为什么Postgres不支持这种语法,而是为什么MySQL会这样做。在大多数RDBMS中,别名仅在执行查询后才会解析,因此您无法在声明它们的查询中使用它们。例如,更常见的用例 - 您不能在声明它的query / table-element的where子句中使用列别名。

一种方法是使用子查询:

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

答案 1 :(得分:3)

你应该使用PostgreSQL语法,因为PgSql不支持这种方式的子查询,试试这个

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

答案 2 :(得分:2)

我找不到任何好的来源,但我确信该标准不要求在相关子查询中可见的投影列别名。我刚刚在SQL Server和Oracle中尝试过它,它们似乎都同意PostgreSQL,拒绝在相关的子查询中使用x,无论它位于外部选择的哪个子句中。

类似于MySQL允许以下查询的方式:

SELECT a + 1 x
FROM t
ORDER BY x + 1

但SQL Server和Postgres没有。对于在各种子句中使用别名而不是标准要求,MySQL似乎更宽容。