Nur neugierig auf SQL-Syntax. Also wenn ich habe
SELECT
itemName as ItemName,
substring(itemName, 1,1) as FirstLetter,
Count(itemName)
FROM table1
GROUP BY itemName, FirstLetter
Das wäre falsch, weil
GROUP BY itemName, FirstLetter
sollte wirklich sein
GROUP BY itemName, substring(itemName, 1,1)
Aber warum können wir erstere nicht einfach der Einfachheit halber verwenden?
Antworten:
SQL wird so implementiert, als ob eine Abfrage in der folgenden Reihenfolge ausgeführt wurde:
Für die meisten relationalen Datenbanksysteme wird in dieser Reihenfolge erläutert, welche Namen (Spalten oder Aliase) gültig sind, da sie in einem vorherigen Schritt eingeführt worden sein müssen.
In Oracle und SQL Server können Sie daher keinen Begriff in der GROUP BY-Klausel verwenden, die Sie in der SELECT-Klausel definieren, da GROUP BY vor der SELECT-Klausel ausgeführt wird.
Es gibt jedoch Ausnahmen: MySQL und Postgres scheinen eine zusätzliche Intelligenz zu haben, die dies ermöglicht.
quelle
GROUP BY substring(itemName, 1,1)
der Fall ist , ist die Datenbank intelligent genug, um den Leistungseinbruch bei der Neuberechnung des Teilstrings in der SELECT-Klausel nicht zu erleiden?sql_mode
ohne ONLY_FULL_GROUP_BY in der Bitmaske hat der Optimizer eine Chance zu liefern bessere Ergebnisse mit einer variierten / unterschiedlichen Verwendung der Alias in derHAVING
Klausel.Sie können jederzeit eine Unterabfrage verwenden, um den Alias zu verwenden. Überprüfen Sie natürlich die Leistung (Möglicherweise wird der Datenbankserver beide gleich ausgeführt, es tut jedoch nie weh, dies zu überprüfen):
quelle
Zumindest in PostgreSQL können Sie die Spaltennummer in der Ergebnismenge in Ihrer GROUP BY-Klausel verwenden:
Natürlich wird dies zu einem Problem, wenn Sie dies interaktiv tun und die Abfrage bearbeiten, um die Anzahl oder Reihenfolge der Spalten im Ergebnis zu ändern. Aber dennoch.
quelle
GROUP BY FirstLetter
ist in Postgresql erlaubt. Versuchen Sie dies in Postgresql: Wählen Sie Teilzeichenfolge (Tabellenname, 1,2) als tname aus der Gruppe information_schema.tables nach tnameGROUP BY
einen Ausdruck zu finden, der Aggregatfunktionen oder Fensterfunktionen enthält, was "offensichtlich" nicht funktioniert.In SQL Server können Sie aufgrund der logischen Reihenfolge der Verarbeitung nicht auf den Alias in der GROUP BY-Klausel verweisen. Die GROUP BY-Klausel wird vor der SELECT-Klausel verarbeitet, sodass der Alias bei der Auswertung der GROUP BY-Klausel nicht bekannt ist. Dies erklärt auch, warum Sie den Alias in der ORDER BY-Klausel verwenden können.
Hier finden Sie eine Informationsquelle zu den logischen Verarbeitungsphasen von SQL Server .
quelle
Ich antworte nicht, warum dies so ist, sondern wollte nur einen Weg zeigen, um diese Einschränkung in SQL Server
CROSS APPLY
zu umgehen, indem ich den Alias verwende. Sie verwenden es dann in derGROUP BY
Klausel wie folgt:quelle
Beachten Sie, dass die Verwendung von Alias in Group By (für Dienste, die dies unterstützen, wie z. B. Postgres) zu unbeabsichtigten Ergebnissen führen kann. Wenn Sie beispielsweise einen Alias erstellen, der bereits in der inneren Anweisung vorhanden ist, wählt die Gruppe nach den Namen des inneren Felds.
quelle
Bei einigen DBMS können Sie einen Alias verwenden, anstatt den gesamten Ausdruck wiederholen zu müssen.
Teradata ist ein solches Beispiel.
Ich vermeide die von Bill empfohlene ordinale Positionsnotation aus Gründen, die in dieser SO-Frage dokumentiert sind .
Die einfache und robuste Alternative besteht darin, den Ausdruck in der GROUP BY-Klausel immer zu wiederholen.
DRY gilt NICHT für SQL.
quelle
Achten Sie beim Gruppieren der Ergebnisse aus einer Ansicht in SQLite auf die Verwendung von Aliasen. Sie erhalten unerwartete Ergebnisse, wenn der Aliasname mit dem Spaltennamen aller zugrunde liegenden Tabellen (für die Ansichten) übereinstimmt.
quelle
Damals stellte ich fest, dass Rdb, das frühere DEC-Produkt, das jetzt von Oracle unterstützt wird, die Verwendung des Spaltenalias in GROUP BY ermöglichte. Mainstream Oracle bis Version 11 erlaubt nicht, dass der Spaltenalias in GROUP BY verwendet wird. Ich bin nicht sicher, was Postgresql, SQL Server, MySQL usw. zulassen oder nicht zulassen. YMMV.
quelle