2015-05-27 15 views
6

Wenn ich MySQL verwende, wird die folgende Abfrage sauber ausgeführt.Über Unterabfrage in MySQL und PostgreSQL

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

PostgreSQL gibt jedoch einen Fehler zurück.

ERROR: column "num1" does not exist 

Warum reagiert es anders?

+0

Was bedeutet 'nicht Werk'? – Jens

+0

Sorry, ich meine die SQL konnte nicht in PostgreSQL – naohide

+0

laufen Fehlermeldungen? – Jens

Antwort

3

Sie PostgreSQL-Syntax verwenden sollten, weil PgSql, nicht Sub-Abfrage auf diese Weise unterstützen versuchen, diese

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

danke, das ist perfekt für mich! @girish – naohide

2

Ich kann keine gute Quelle finden, aber ich bin mir ziemlich sicher, dass der Standard keine Aliase projizierter Spalten benötigt, um in einer korrelierten Unterabfrage sichtbar zu sein. Ich habe es gerade in SQL Server und Oracle versucht, und beide scheinen hier mit PostgreSQL übereinzustimmen und die Verwendung von x in einer korrelierten Unterabfrage abzulehnen, egal in welcher Klausel der äußeren Auswahl sie sich befindet.

Es ist ähnlich wie MySQL ermöglicht die folgende Abfrage:

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

aber SQL Server und Postgres nicht. MySQL scheint in Bezug auf die Verwendung von Aliasen in verschiedenen Klauseln toleranter zu sein, als es der Standard erfordert.

+0

yeah; Das ist, weil wählen Sie, wenn nach allem anderen ausgewertet. Aber warum nicht erlauben, wählen Sie 1 als num1, num1 + 1 als num2' –

4

Die Frage sollte nicht, warum nicht der Fall ist Postgres diese Syntax unterstützt, aber warum MySQL tut. In den meisten RDBMS werden Aliase nur nach der Ausführung der Abfrage aufgelöst, sodass Sie sie nicht in der Abfrage verwenden können, die sie deklariert. Z. B. der üblichere Anwendungsfall - Sie können keinen Spaltenalias in einer where-Klausel des query/table-Elements verwenden, das sie deklariert hat.

Ein Weg, um dieses ist Subqueries zu verwenden:

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

MySQL erlaubt auch keine Aliase in WHERE. – Ishamael

Verwandte Themen