2011-09-12 15 views
117

Qualcuno mi ha inviato una query SQL in cui la clausola GROUP BY consisteva nell'istruzione: GROUP BY 1.Che cosa significa clausola SQL "GROUP BY 1"?

Questo deve essere un refuso vero? Nessuna colonna ha lo pseudonimo 1. Cosa potrebbe significare? Ho ragione di ritenere che questo deve essere un refuso?

+2

Non è un errore di battitura, è la prima colonna del tuo set di risultati – Lamak

+5

Nota che questa sintassi non è portabile. Si comporterà diversamente su database diversi da mysql. In Oracle, ad esempio, è considerato una costante. –

+2

@RussellReed Sì. sfortunatamente (dal momento che usare un alias a volte è molto utile) ansi sql non consente il raggruppamento per colonna ordinale. La ragione è che il gruppo accade prima della proiezione. Ma poi .. cosa succede quando abbiamo raggruppato le espressioni con decine di linee .. finiamo con .. * mutipli * di decine di linee nell'istruzione sql finale. – javadba

risposta

128

Significa raggruppare per la prima colonna indipendentemente da come viene chiamato. Puoi fare lo stesso con ORDER BY.

8

Sarà gruppo dal primo campo nella clausola select

32
SELECT account_id, open_emp_id 
     ^^^^  ^^^^ 
      1   2 

FROM account 
GROUP BY 1; 

In precedenza interrogazione GROUP BY 1 riferisce al first column in select statement che è account_id.

È inoltre possibile specificare in ORDER BY.

17

Oltre al raggruppamento in base al nome del campo, è possibile anche raggruppare per ordinale o posizionare il campo.

Questo è generalmente sconsigliato se si sta raggruppando su qualcosa di specifico, poiché la struttura tabella/vista potrebbe cambiare; Inoltre, è più difficile da leggere (credito: Yuck). Tuttavia, se stai restituendo un insieme unico di qualcosa, allora va bene.

+5

+1 per "non fare questo" e aggiungerei che la migliore ragione per evitarlo è che non è leggibile. – Yuck

1

Si raggruppa in base alla posizione della colonna inserita dopo la clausola group by.

ad esempio se si esegue 'SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1' si raggrupperà per SALESMAN_NAME.

Un rischio è farlo se si esegue 'Select *' e per qualche motivo si ricrea la tabella con colonne su un ordine diverso, si otterrà un risultato diverso da quello che ci si aspetterebbe.

0

Ciò significa Gruppo SQL entro il 1 ° colonna del select clausola, abbiamo sempre utilizzare questo GROUP BY 1 insieme ORDER BY 1, oltre si può anche utilizzare come questo GROUP BY 1,2,3.., naturalmente, è conveniente per noi, ma è necessario prestare attenzione a tale condizione il risultato potrebbe non essere quello che vuoi se qualcuno ha modificato le colonne selezionate e non è visualizzato