2017-01-24 3 views
0

ich eine Tabelle in meiner SQL Server-Datenbank habe dayorder genannt, mit den Feldern:Sortieren Abfrage von Feld zu einem anderen Feld im Zusammenhang

dayorder_cod (autoinc id), 
dayorder_number (order number), 
dayorder_sequence (order sequence) 
dayorder_parent (parent order, can be null). 

So kann ich zum Beispiel Aufträge 100, 200, 998 und 999 , wobei 100 die Eltern von 998 und 999 ist.

Ich möchte das Ergebnis wie folgt sortieren: 100, 998, 999, 200, dh die Kinder einer Bestellung kommen knapp unter ihre Eltern.

+1

Sie bitte das DBMS markieren Sie – TheGameiswar

Antwort

4

Keine erforderlich join:

wenn dayorder_parent Referenzen dayorder_number, dann:

select d.* 
from dayorder d 
order by 
    isnull(d.dayorder_parent,d.dayorder_number) 
    , d.dayorder_number 

wenn dayorder_parent Referenzen dayorder_cod, dann:

select d.* 
from dayorder d 
order by 
    isnull(d.dayorder_parent,d.dayorder_cod) 
    , d.dayorder_cod 

wenn dayorder_sequence ist wichtig für die Bestellung

select d.* 
from dayorder d 
order by 
    isnull(d.dayorder_parent,d.dayorder_cod) 
    , d.dayorder_sequence 

Wie es funktioniert: die Abfrageergebnisse geordnet durch die dayorder_parent, aber die erste Zeile für jede Bestellung wird einen Wert vonhabenfür dayorder_parent.

Mit isnull(d.dayorder_parent,d.dayorder_number) können wir sagen, dass, wenn eine Bestellung kein Elternteil hat, verwenden Sie stattdessen dayorder_number. Kinder von 100 werden mit 100 gruppiert, und jede Gruppe wird weiter von ihrer individuellen dayorder_number bestellt.

Hinweis: Sie können coalesce() anstelle von isnull() verwenden, um die gleichen Ergebnisse zu erhalten. Ich neige dazu, coalesce() nur zu verwenden, wenn ich den ersten Nicht-Null-Wert von einem Satz von 3 oder mehr Werten erhalten muss, da isnull() nur zwei Parameter unterstützt.

+0

Das ist es! Kannst du mir bitte erklären, wie das funktioniert? – aseolin

+0

Eine Erklärung hinzugefügt, hilft das? – SqlZim

+0

Vielen Dank. Es ist jetzt sehr klar. – aseolin

3

Try this:

SELECT t1.* 
FROM dayorder AS t1 
LEFT JOIN dayorder AS t2 ON t2.parent = t1.cod 
ORDER BY COALESCE(t2.parent, t1.cod), t1.cod 

Edit:

Bei sequence Feldreihenfolge in der Tabelle bestimmt, dann können Sie verwenden:

SELECT t1.* 
FROM dayorder AS t1 
LEFT JOIN dayorder AS t2 ON t2.parent = t1.cod 
ORDER BY COALESCE(t2.sequence, t1.sequence), t1.sequence 
+0

verwenden Es funktioniert nicht. – aseolin

+0

@aseolin In welcher Weise? Ersetzen Sie einfach das cod-Feld durch das Feld, das die Reihenfolge in Ihrer Tabelle bestimmt. –

Verwandte Themen