Frage

Nehmen wir an, meine Beziehung ist so

enter image description here

und ich wollte nach Rang sortieren, aber zuerst nach A und B.So wird meine Beziehung aussehen

enter image description here

Zuerst habe ich versucht, nur zwei Relationen zu haben, indem ich beide nach Rang ordne und dann die beiden Relationen zusammenfüge, aber am Ende werden sie einfach durcheinander gebracht.Ich habe auch versucht, Fälle zu verwenden, aber ich verstehe nicht, wie es funktioniert.Ich bekam immer wieder Fehlermeldungen über das Mischen von Zeichen mit ganzen Zahlen.

Bearbeiten:Ich habe vergessen zu erwähnen, dass ich nach einer etwas komplexen Anzahl von Ansichten am Ende die erste Beziehung oben habe.Ich habe zum Beispiel zwei Ansichten erstellt, eine mit nur den Klassen A und B, und diese dann nach Rang sortiert.Zweite Ansicht nur C-Klassen, geordnet nach Rang.Dann habe ich sie vereint, aber sie vermischen sich einfach.

War es hilfreich?

Lösung

Sie brauchen nur eine CASE Ausdruck in der ORDER BY, um die Zeilen in zwei Gruppen zu unterteilen, sodass diejenigen mit der Klasse „A“ oder „B“ in die erste Gruppe eingefügt werden (1) und alle anderen im zweiten (2):

ORDER BY 
    CASE WHEN class IN ('A', 'B') THEN 1 ELSE 2 END,
    rank ;

Andere Tipps

Ich werde Ihnen ein Beispiel für eine Möglichkeit geben, bei der ich CTEs verwende, die in vielen Datenbanken verfügbar sind, insbesondere in PostgreSQL, mit dem ich am besten vertraut bin.

CTEs und die WITH Klausel

CTEs ermöglichen Ihnen die Bildung temporärer, tabellenähnlicher Einzelabfragestrukturen. Da Sie jedoch dafür sorgen können, dass CTEs in einer einzelnen Abfrage aufeinander angewiesen sind, bietet es eine bequeme und leicht verständliche Möglichkeit, Ihre Abfrage semi-prozedural zu gestalten.

In Deinem Fall würde ich es versuchen

WITH AB_results AS(
  SELECT class, rank, 1 AS hidden_rank
  FROM my_relation
  WHERE class IN ('A','B')
),
Non_AB_results AS(
  SELECT class, rank, 2 AS hidden_rank
  FROM my_relation
  WHERE class NOT IN ('A','B')
)
SELECT COALESCE(AB_results.class,Non_AB_results.class), rank
FROM AB_results
FULL OUTER JOIN Non_AB_results
USING(hidden_rank,rank)
ORDER BY hidden_rank, rank;

Ich werde hier in ein paar Minuten versuchen, eine SQLFiddle zusammenzustellen, nur um sicherzugehen, dass ich bei meiner Abfrage nicht einen Fehler gemacht habe.:P

BEARBEITEN:Mir ist ein kleiner Fehler unterlaufen.Ich versuche, es in einem Beispiel aufzuklären, während wir sprechen.

EDIT 2:Der Fehler ist nun behoben!Leider hat SQLFiddle im Moment ein kleines Problem, aber HIER ist der Link zur SQLFiddle für einige Tests.

bitte beachten Sie dass ich das vielleicht nicht auf die eleganteste Art und Weise gelöst habe, aber es sollte Ihre Probleme lösen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top