Jestem po prostu ciekawy składni SQL. Więc jeśli mam
SELECT
itemName as ItemName,
substring(itemName, 1,1) as FirstLetter,
Count(itemName)
FROM table1
GROUP BY itemName, FirstLetter
Byłoby to nieprawidłowe, ponieważ
GROUP BY itemName, FirstLetter
naprawdę powinno być
GROUP BY itemName, substring(itemName, 1,1)
Ale dlaczego nie możemy po prostu użyć tego pierwszego dla wygody?
Odpowiedzi:
SQL jest implementowany tak, jakby zapytanie zostało wykonane w następującej kolejności:
W przypadku większości systemów relacyjnych baz danych ta kolejność wyjaśnia, które nazwy (kolumny lub aliasy) są prawidłowe, ponieważ musiały zostać wprowadzone w poprzednim kroku.
Dlatego w Oracle i SQL Server nie można użyć terminu w klauzuli GROUP BY zdefiniowanej w klauzuli SELECT, ponieważ GROUP BY jest wykonywana przed klauzulą SELECT.
Są jednak wyjątki: MySQL i Postgres wydają się mieć dodatkową inteligencję, która na to pozwala.
źródło
GROUP BY substring(itemName, 1,1)
, to czy baza danych jest wystarczająco inteligentna, aby nie przyjąć wydajności wynikającej z ponownego obliczenia podciągu w klauzuli SELECT?sql_mode
bez uwzględnienia ONLY_FULL_GROUP_BY w masce bitowej, Optymalizator ma szansę na uzyskanie lepszych wyników przy zróżnicowanym / różnym użyciu aliasu wHAVING
klauzuli.Zawsze możesz użyć podzapytania, aby móc użyć aliasu; Oczywiście sprawdź wydajność (możliwe, że serwer db będzie działał tak samo, ale weryfikacja nigdy nie zaszkodzi):
źródło
Przynajmniej w PostgreSQL możesz użyć numeru kolumny w zestawie wyników w swojej klauzuli GROUP BY:
Oczywiście zaczyna to być uciążliwe, jeśli robisz to interaktywnie i edytujesz zapytanie, aby zmienić liczbę lub kolejność kolumn w wyniku. Ale nadal.
źródło
GROUP BY FirstLetter
jest dozwolone w Postgresql. Na przykład, spróbuj uruchomić to w Postgresql: wybierz podciąg (nazwa_tabeli, 1,2) jako tname z grupy information_schema.tables według tnameGROUP BY
wyrażenia, które zawiera funkcje agregujące lub funkcje okna, które „oczywiście” nie działają.SQL Server nie pozwala na odwoływanie się do aliasu w klauzuli GROUP BY ze względu na logiczną kolejność przetwarzania. Klauzula GROUP BY jest przetwarzana przed klauzulą SELECT, więc alias nie jest znany podczas oceny klauzuli GROUP BY. To wyjaśnia również, dlaczego możesz użyć aliasu w klauzuli ORDER BY.
Oto jedno źródło informacji o fazach przetwarzania logicznego programu SQL Server .
źródło
Nie odpowiadam, dlaczego tak jest, ale chciałem tylko pokazać sposób obejścia tego ograniczenia w SQL Server, używając
CROSS APPLY
do utworzenia aliasu. Następnie używasz go wGROUP BY
klauzuli, na przykład:źródło
Uwaga, używanie aliasu w grupie Group By (w przypadku usług, które ją obsługują, takich jak postgres) może mieć niezamierzone rezultaty. Na przykład, jeśli utworzysz alias, który już istnieje w instrukcji wewnętrznej, funkcja Group By wybierze nazwę pola wewnętrznego.
źródło
Niektóre DBMS pozwalają na użycie aliasu zamiast powtarzania całego wyrażenia.
Teradata jest jednym z takich przykładów.
Unikam notacji pozycji porządkowej zgodnie z zaleceniami Billa z powodów udokumentowanych w tym pytaniu SO .
Łatwą i niezawodną alternatywą jest zawsze powtarzanie wyrażenia w klauzuli GROUP BY.
DRY NIE ma zastosowania do SQL.
źródło
Uważaj na aliasy podczas grupowania wyników z widoku w SQLite. Otrzymasz nieoczekiwane wyniki, jeśli nazwa aliasu jest taka sama, jak nazwa kolumny dowolnej podstawowej tabeli (do widoków).
źródło
Kiedyś odkryłem, że Rdb, poprzedni produkt DEC obsługiwany teraz przez Oracle, zezwalał na użycie aliasu kolumny w GROUP BY. Od wersji Mainstream Oracle do wersji 11 nie można używać aliasu kolumny w funkcji GROUP BY. Nie jestem pewien, co Postgresql, SQL Server, MySQL itp. Pozwoli lub nie pozwoli. YMMV.
źródło