Ktoś wysłał mi kwerendy SQL, gdzie GROUP BY
klauzula składał oświadczenia: GROUP BY 1
.
To musi być literówka, prawda? Alias nie zawiera żadnej kolumny. Co to może znaczyć? Czy mam prawo założyć, że to musi być literówka?
Ktoś wysłał mi kwerendy SQL, gdzie GROUP BY
klauzula składał oświadczenia: GROUP BY 1
.
To musi być literówka, prawda? Alias nie zawiera żadnej kolumny. Co to może znaczyć? Czy mam prawo założyć, że to musi być literówka?
Odpowiedzi:
SELECT account_id, open_emp_id
^^^^ ^^^^
1 2
FROM account
GROUP BY 1;
W powyższym zapytaniu GROUP BY 1
odnosi się do tego, first column in select statement
co jest
account_id
.
Możesz także podać w ORDER BY
.
Uwaga: Liczba w ORDER BY i GROUP BY zawsze zaczyna się od 1, a nie od 0.
Oprócz grupowania według nazwy pola można również grupować według porządkowej lub pozycji pola w tabeli. 1 odpowiada pierwszemu polu (niezależnie od nazwy), 2 oznacza drugie i tak dalej.
Jest to generalnie odradzane, jeśli grupujesz coś konkretnego, ponieważ struktura tabeli / widoku może ulec zmianie. Dodatkowo może być trudno szybko zrozumieć, co robi zapytanie SQL, jeśli nie zapamiętałeś pól tabeli.
Jeśli zwracasz unikalny zestaw lub szybko przeprowadzasz tymczasowe wyszukiwanie, jest to miła skrócona składnia, aby ograniczyć pisanie. Jeśli planujesz ponownie uruchomić zapytanie w pewnym momencie, zalecam ich zastąpienie, aby uniknąć przyszłych nieporozumień i nieoczekiwanych komplikacji (z powodu zmian w schemacie).
Pogrupuje według pierwszego pola w klauzuli select
Oznacza to, że grupa sql według 1. kolumny w Twojej klauzuli select, zawsze używamy tego GROUP BY 1
razem ORDER BY 1
, poza tym możesz również używać w ten sposób GROUP BY 1,2,3..
, oczywiście jest to dla nas wygodne, ale musisz zwrócić uwagę na ten warunek, wynik może nie być tym, co ty chcesz, jeśli ktoś zmodyfikował wybrane kolumny i nie jest to wizualizowane
Będzie grupować według pozycji kolumny, którą umieściłeś po grupie według klauzuli.
Na przykład, jeśli uruchomić „ SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1
” to będzie przez grupę SALESMAN_NAME
.
Jednym z ryzyk jest to, że jeśli uruchomisz ' Select *
' iz jakiegoś powodu odtworzysz tabelę z kolumnami w innej kolejności, da ci to inny wynik, niż byś się spodziewał.