2015-05-27 13 views
6

Quando utilizzo MySQL, la seguente query viene eseguita correttamente.Informazioni sulla sottoquery in MySQL e PostgreSQL

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

Ma PostgreSQL restituisce un errore.

ERROR: column "num1" does not exist 

Perché risponde in modo diverso?

+0

cosa significa 'non work'? – Jens

+0

scusate, voglio dire che sql non può essere eseguito in PostgreSQL – naohide

+0

Qualche messaggio di errore? L'errore – Jens

risposta

3

si dovrebbe utilizzare la sintassi PostgreSQL, perché PgSql non supporta sub interrogazione in questo modo, provare questo

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

grazie, questo è perfetto per me! @girish – naohide

2

Non riesco a trovare alcuna buona fonte, ma sono abbastanza sicuro che lo standard non richiede alias di colonne proiettate per essere visibile all'interno di una query secondaria correlata. Ho appena provato in SQL Server e Oracle, ed entrambi sembrano essere d'accordo con PostgreSQL qui, rifiutando l'uso di x in una query secondaria correlata, non importa in quale clausola della selezione esterna si trova.

È simile a come MySQL permette la seguente query:

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

ma SQL Server e Postgres non lo fanno. MySQL sembra essere più permissivo riguardo all'uso di alias in varie clausole rispetto a quanto richiesto dallo standard.

+0

sì; questo perché selezionare se valutato dopo qualsiasi altra cosa. Ma perché non consentire 'seleziona 1 come num1, num1 + 1 come num2' –

4

La questione non dovrebbe essere il motivo per cui si fa Postgres non supportano questa sintassi, ma perché MySQL fa. Nella maggior parte degli RDBMS, gli alias vengono risolti solo dopo l'esecuzione della query, quindi non è possibile utilizzarli dall'interno della query che li dichiara. Ad esempio, l'usecase più comune: non è possibile utilizzare un alias di colonna in una clausola where della query/elemento-tabella che lo ha dichiarato.

Un modo per aggirare questo è quello di utilizzare subquery:

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

MySQL non consente alias in WHERE neanche. – Ishamael