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

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

Patricia Arquette
Patricia ArquetteOriginal
2025-01-10 14:46:42256Durchsuche

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

Spaltennamen in SQL GROUP BY und ORDER BY-Klauseln

Frage:

Beim Gruppieren von Daten in SQL müssen Sie die richtigen Spaltennamen in den Klauseln GROUP BY und ORDER BY angeben. Wenn ein Namenskonflikt zwischen den Eingabe- und Ausgabespalten besteht, sind die Ergebnisse möglicherweise falsch.

Lösung:

GROUP BYKlausel

  • Vermeiden Sie die Verwendung von Quellspaltennamen: Verwenden Sie Quellspaltennamen (z. B. attempt.result) nicht direkt zum Gruppieren. Die Gruppierung sollte mithilfe eines CASE-Ausdrucks erfolgen, der das gewünschte Ergebnis bestimmt. Dadurch wird sichergestellt, dass Sie nach den richtigen Werten gruppieren.

    <code class="language-sql">  GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END</code>
  • Spaltenaliasnamen verwenden: Wenn Sie lieber die ursprünglichen Spaltennamen verwenden möchten, geben Sie in der Liste SELECT einen anderen Aliasnamen an. Dadurch wird verhindert, dass die Ausgabespalten die Gruppierung beeinträchtigen.

    <code class="language-sql">  SELECT ... , CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1
      GROUP BY model.name, attempt.type, result1</code>

ORDER BYKlausel

  • Verwenden Sie Positionsverweise: Anstatt die Namen der Ausgabespalten direkt in Anführungszeichen zu setzen, verwenden Sie Positionsverweise (Ordnungszahlen) in der ORDER BY-Klausel. Dadurch werden mögliche Namenskonflikte vermieden.

    <code class="language-sql">  ORDER BY 1, 2, 3</code>

Beispiel:

Schreiben Sie die Abfrage unter Verwendung der korrekten JOIN Syntax, der Positionsverweise und der Lösung von Namenskonflikten neu:

<code class="language-sql">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 <  '2013-11-07 00:00:00'
GROUP  BY 1, 2, 3
ORDER  BY 1, 2, 3;</code>

Das obige ist der detaillierte Inhalt vonWie vermeide ich Namenskonflikte in den 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