2015-05-27 80 views
6

當我使用MySQL時,以下查詢運行乾淨。關於MySQL和PostgreSQL中的子查詢

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

但PostgreSQL返回錯誤。

ERROR: column "num1" does not exist 

爲什麼它的反應不同?

+0

拿什麼'不work'? – Jens

+0

對不起,我的意思是SQL無法在PostgreSQL中運行 – naohide

+0

任何錯誤消息? – Jens

回答

3

,你應該使用PostgreSQL語法,因爲PGSQL不支持子查詢這樣一來,試試這個

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

謝謝,這對我來說是完美的! @girish – naohide

2

我找不到任何好的源代碼,但我確定該標準不需要投影列的別名在相關子查詢中可見。我只是在SQL Server和Oracle中嘗試過,他們兩個似乎都同意PostgreSQL,拒絕在相關的子查詢中使用x,而不管它位於外部選擇的哪一個子句。

它類似於MySQL的是如何讓下面的查詢:

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

但SQL Server和Postgres沒有。關於在各個子句中使用別名,MySQL似乎比標準要求更寬鬆。

+0

是啊;那是因爲如果在其他任何事情之後進行評估,選擇。但爲什麼不讓'select 1作爲num1,num1 + 1作爲num2' –

4

的問題不應該是爲什麼Postgres的不支持這種語法,但爲什麼MySQL的一樣。在大多數RDBMS中,只有在執行查詢後才解析別名,因此不能在聲明它們的查詢中使用它們。例如,更常見的用例 - 不能在聲明它的查詢/表格元素的where子句中使用列別名。解決此

一種方法是使用子查詢:

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

MySQL不允許在WHERE中使用別名。 – Ishamael