Heim >Datenbank >MySQL-Tutorial >Wie vermeide ich Namenskonflikte in SQL-Klauseln GROUP BY und ORDER BY?

Wie vermeide ich Namenskonflikte in SQL-Klauseln GROUP BY und ORDER BY?

Barbara Streisand
Barbara StreisandOriginal
2025-01-10 14:51:43618Durchsuche

How to Avoid Naming Conflicts in SQL GROUP BY and ORDER BY Clauses?

Tipps zur Vermeidung von Namenskonflikten in SQL-Klauseln GROUP BY und ORDER BY

Bei SQL-Abfragen, bei denen mehrere Spalten kombiniert und sortiert werden, müssen die in den Klauseln GROUP BY und ORDER BY verwendeten Spaltennamen sorgfältig geprüft werden, da es möglicherweise Namensunterschiede zwischen den Ausgabespaltennamen und den Quellspaltennamen gibt im SQL-Sprachkonflikt.

Das Ziel einer Abfrage besteht beispielsweise darin, Daten nach Hardwaremodell (Name), Versuchstyp (Typ) und binärem Ergebnis (auf 0 oder 1 vereinfachtes Ergebnis) zu gruppieren. Die gewünschte Ausgabe besteht jedoch darin, für jedes Modell nur eine Zeile mit einer eindeutigen Kombination aus Typ und Groß-/Kleinschreibung anzuzeigen.

Das Problem entsteht durch die Verwendung des Quellspaltennamens GROUP BY sowohl in den Ausdrücken CASE als auch result. Der SQL-Standard besagt, dass GROUP BY in diesem Fall result als Quellspaltennamen und ORDER BY als Ausgabespaltennamen interpretiert.

Um diesen Konflikt zu lösen und die erwartete Ausgabe zu erhalten, gibt es mehrere Möglichkeiten:

  1. Spaltenalias verwenden : Fügen Sie dem CASE-Ausdruck einen Alias ​​hinzu und stellen Sie sicher, dass er sich von allen Quellspaltennamen unterscheidet. Zum Beispiel:
<code class="language-sql">...
CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1
...
GROUP BY model.name, attempt.type, result1
...</code>
  1. Positionsreferenz verwenden: Verwenden Sie eine Zahl, um explizit auf die Position einer Spalte in der SELECT-Liste zu verweisen. Zum Beispiel:
<code class="language-sql">...
GROUP BY 1, 2, 3
...</code>
  1. enthält Konstanten : Obwohl konstante Spalten (z. B. Tag) nicht in GROUP BY enthalten sein müssen, können sie der Übersichtlichkeit halber hinzugefügt werden, ohne die Ergebnisse zu beeinflussen.

Hier ist die geänderte Abfrage mit Standortreferenzen:

<code class="language-sql">SELECT model.name
     , attempt.type
     , CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result
     , CURRENT_DATE - 1 AS day
     , count(*) AS ct
FROM   attempt
JOIN   prod_hw_id USING (hard_id)
JOIN   model      USING (model_id)
WHERE  ts >= '2013-11-06 00:00:00'  
AND    ts <  '2013-11-07 00:00:00'
GROUP  BY 1, 2, 3
ORDER  BY 1, 2, 3;</code>

Durch die Sicherstellung korrekter Spaltennamen und die Verwendung von Positionsverweisen aggregieren Abfragen jetzt Daten wie erwartet und liefern nur eine Ergebniszeile für jede eindeutige Kombination aus Modell, Typ und Ergebnis.

Das obige ist der detaillierte Inhalt vonWie vermeide ich Namenskonflikte in SQL-Klauseln GROUP BY und ORDER BY?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn