Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [SQL] Daten nach Nachfolger sortieren (https://www.delphipraxis.net/125564-%5Bsql%5D-daten-nach-nachfolger-sortieren.html)

phil_ro 8. Dez 2008 15:39

Datenbank: MSSQL • Version: 2005 • Zugriff über: BDE, MSSQL-ManagementStudio

[SQL] Daten nach Nachfolger sortieren
 
Hallo zusammen,

ich probiere verzweifelt eine SQL-Abfrage zu erstellen die mir meine Daten korrekt sortiert ausgibt.
Die Sortierung soll in der Abfrage und nicht im Programm erfolgen.

Rohdaten aus DB:

ID | Pos | ID_danach
--------------------
5 | 20 | 6
6 | 20 | 7
7 | 10 | 8
8 | 10 | 2
9 | 5 | 10
10 | 5 | 0
2 | 10 | 9

Diese Daten würde ich gerne so sortieren dass als Ergebnis folgendes herauskommt:

ID | Pos | ID_danach
--------------------
5 | 20 | 6
6 | 20 | 7
7 | 10 | 8
8 | 10 | 2
2 | 10 | 9
9 | 5 | 10
10 | 5 | 0

Das bedeutet: Die erste Zeile hat die ID, die bei ID_danach nicht vorkommt (5).
Die Zeilen danach beziehen sich auf ID_danach der jewiligen Vorgängerzeile.

Zeile 1 -> ID_danach = 6
Zeiel 2 -> ID = 6, ID_danach = 7
Zeiel 3 -> ID = 7, ID_danach = 8
.
.
.

Ich hoffe die Frage ist verständlich und es findet sich jemand der sie beantworten kann.

Gruß,
Philipp

mkinzler 8. Dez 2008 15:45

Re: [SQL] Daten nach Nachfolger sortieren
 
Mit einer normalen Abfrage wird das schwer zu bewerkstelligen sein

omata 8. Dez 2008 23:04

Re: [SQL] Daten nach Nachfolger sortieren
 
SQL-Code:
EXECUTE('
  DECLARE @done INT
  DECLARE @depth INT

  SELECT @depth = 1, @done = 0
  SELECT *, @depth AS depth, CONVERT(VARCHAR, id) AS nodepath
  INTO #temp
  FROM tabelle t
  WHERE NOT EXISTS (SELECT *
                    FROM tabelle
                    WHERE id_danach = t.id)

  WHILE @done = 0 BEGIN
    SET @depth = @depth + 1
    INSERT INTO #temp
    SELECT t.*, @depth, x.nodepath + ''|'' + CONVERT(VARCHAR, t.id)
    FROM #temp x
    INNER JOIN tabelle t
      ON x.id_danach = t.id
    WHERE x.depth = @depth - 1
    IF @@ROWCOUNT = 0 SET @done = 1
  END
 
  SELECT *
  FROM #temp
  ORDER BY nodepath

  DROP TABLE #temp
')
Dein Vorgehen ist recht merkwürdig. Normalerweise weist man einem Datensatz seinen Parent zu und nicht seine Children.
Schau auch mal hier

phil_ro 9. Dez 2008 10:02

Re: [SQL] Daten nach Nachfolger sortieren
 
Danke omata,

das klappt so wie ich es mir vorgestellt habe.
Die Zuordnung ist allerdings nicht als Child/Parent Verhältnis zu sehen, sonder als Reihenfolge in der Bauteile auf einem Band liegen.
Jede Zeile entspricht einem Bauteil. ID_danach kennzeichnet das Bauteil dahinter.
In jeder Spalte ID, sowie ID_danach sollte demnach jeder Wert nur einmal vorkommen.

omata 9. Dez 2008 16:55

Re: [SQL] Daten nach Nachfolger sortieren
 
Zitat:

Zitat von phil_ro
...das klappt so wie ich es mir vorgestellt habe.

:thumb: schön das es dir weitergeholfen hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz