SQL GROUP BY
und ORDER BY
Konflikte bei der Benennung von Klauseln: Eine Lösung
Die ursprüngliche Abfrage stößt auf Probleme beim Gruppieren von Daten nach Hardwaremodell, Ergebnistyp und Groß-/Kleinschreibung aufgrund von Namenskonflikten zwischen der berechneten Ausdrucksspalte CASE
und der Quellspalte (attempt.result
). Dies führt zu mehreren Zeilen für identische Typ- und Fallkombinationen.
Die Lösung besteht darin, die direkte Verwendung des Quellspaltennamens innerhalb der GROUP BY
-Klausel zu vermeiden. Hier sind zwei effektive Ansätze:
Methode 1: Gruppieren Sie direkt nach dem CASE-Ausdruck:
Anstatt nach attempt.result
zu gruppieren, gruppieren Sie nach dem CASE
-Ausdruck selbst:
GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END
Dadurch werden die Daten direkt basierend auf dem berechneten Ergebnis der CASE
-Anweisung gruppiert, wodurch Mehrdeutigkeiten beseitigt werden.
Methode 2: Spaltenaliase verwenden:
Weisen Sie der Ausgabespalte des CASE
-Ausdrucks einen Alias zu:
SELECT ..., CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1 GROUP BY model.name, attempt.type, result1
Der Alias result1
unterscheidet die berechnete Spalte deutlich von der Quellspalte und löst so den Konflikt. Beachten Sie, dass ORDER BY
in diesem Fall den Alias-Spaltennamen (result1
) priorisiert.
Best Practice: Positionsreferenzen
Um Namenskonflikte vollständig zu vermeiden, verwenden Sie Positionsverweise innerhalb der GROUP BY
- und ORDER BY
-Klauseln. Dieser Ansatz ist weniger fehleranfällig und verbessert die Lesbarkeit der Abfrage, insbesondere bei komplexen Abfragen. Das folgende Beispiel demonstriert diese Technik innerhalb einer vereinfachten und umgeschriebenen Abfrage:
SELECT m.name, a.type, CASE WHEN a.result = 0 THEN 0 ELSE 1 END AS result, CURRENT_DATE - 1 AS day, count(*) AS ct FROM attempt a JOIN prod_hw_id p USING (hard_id) JOIN model m USING (model_id) WHERE ts >= '2013-11-06 00:00:00' AND ts < CURRENT_DATE --Corrected the incomplete WHERE clause GROUP BY 1, 2, 3 -- Positional references for model.name, a.type, result ORDER BY 1, 2, 3 -- Positional references for model.name, a.type, result
Diese überarbeitete Abfrage ist prägnanter und vermeidet mögliche Namenskonflikte. Denken Sie daran, Ihre WHERE
-Klausel immer auf Vollständigkeit zu überprüfen. Das Original war unvollständig und wurde oben korrigiert.
Das obige ist der detaillierte Inhalt vonWie löst man Namenskonflikte in SQL-Klauseln GROUP BY und ORDER BY?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!