Perché ho bisogno di specificare esplicitamente tutte le colonne in una SQL clausola di “GROUP BY” - perché non “GROUP BY *”?

StackOverflow https://stackoverflow.com/questions/2777235

Domanda

Questo mi ha sempre infastidito - perché il clausola GROUP BY in un'istruzione SQL richiedono che includo tutte le colonne non di aggregazione? Queste colonne devono essere incluse di default - una sorta di "GROUP BY *" - dal momento che non riesco nemmeno a eseguire la query meno che non siano tutti inclusi. Ogni colonna deve essere sia un aggregato o essere specificato nel "GROUP BY", ma sembra che tutto ciò che non aggregate dovrebbe essere raggruppati automaticamente.

Forse è parte dello standard ANSI-SQL, ma anche così, io non capisco perché. Qualcuno può aiutarmi a capire la necessità di questa convenzione?

È stato utile?

Soluzione

E 'difficile sapere esattamente ciò che i progettisti del linguaggio SQL stavano pensando quando hanno scritto lo standard, ma qui è il mio parere .

SQL, come regola generale, si richiede di dichiarare esplicitamente le vostre aspettative e il vostro intento. Il linguaggio non cerca di "Indovina che cosa avete significato" , e compila automaticamente gli spazi vuoti. Questa è una buona cosa .

Quando si scrive una query il più importante considerazione è che produce risultati corretti . Se hai fatto un errore, probabilmente è meglio che le SQL parser informa voi, piuttosto che fare una supposizione circa la vostra intenzione e restituire i risultati che potrebbero non essere corrette. La natura dichiarativa di SQL (dove dichiarate ciò che si desidera recuperare, piuttosto che i passi come recuperarla) rende già facile fare inavvertitamente errori. L'introduzione fuzziniess nella sintassi del linguaggio non farebbe meglio questo .

In realtà, tutti i casi mi viene in mente in cui la lingua permette di problemi scorciatoie ha causato. Prendiamo, per esempio, naturale unisce - dove è possibile omettere i nomi delle colonne che si desidera unire e sul consentire al database di dedurre quali basati su nomi di colonna. Una volta che il cambiamento nomi delle colonne (come naturalmente fanno nel tempo) - la semantica di query esistenti cambia con loro . Questo è male ... molto male -. Davvero non si desidera che questo tipo di magia accadendo dietro le quinte nel codice del database

Una delle conseguenze di questa scelta di design, tuttavia, è che SQL è un verboso lingua in cui è necessario in modo esplicito esprimere il vostro intento. Ciò può portare a dover scrivere più codice di quello che può piacere, e lamentela circa il motivo per cui certi costrutti sono così verbose ... ma alla fine della giornata -. E 'quello che è

Altri suggerimenti

E 'semplice proprio come questo: avete chiesto di Gruppo SQL i risultati per ogni singola colonna nella clausola from, il che significa per ogni colonna nella clausola from SQL, il motore SQL internamente gruppo i set di risultati prima di presentare a voi . In modo che spiega perché vi chiedo di parlare di tutte le colonne presenti nella da troppo perché la sua non è possibile gruppo parzialmente. Se lei ha citato il gruppo dalla clausola che è possibile solo a sql realizzare il vostro intento raggruppando tutte le colonne pure. Si tratta di una restrizione di matematica.

Il motivo logico che posso pensare di mantenere la clausola di GROUP BY come è che è possibile includere i campi che non sono inclusi nella colonna di selezione nel raggruppamento.

Ad esempio.

Select column1, SUM(column2) AS sum
 FROM table1
 GROUP BY column1, column3

Anche se column3 non è rappresentata altrove nella query, è ancora possibile raggruppare i risultati per il suo valore. (Naturalmente, una volta che avete fatto, non si può dire dal risultato perché i record sono stati raggruppati come erano.)

Si fa sembrare una semplice scorciatoia per lo scenario più comune schiacciante (il raggruppamento per ciascuna delle colonne non di aggregazione) sarebbe uno strumento semplice ma efficace per accelerare la codifica.

Forse "GROUP BY *"

Dal momento che è già abbastanza comune in strumenti di SQL per consentire i riferimenti alle colonne in base al numero di colonna risultato (es. GROUP BY 1,2,3, etc.) Sembrerebbe ancora più semplice per essere in grado di consentire all'utente di inserire automaticamente tutti i campi della non-aggregate in una sequenza di tasti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top