Aufbau der Tabelle:
RUECKMELDE_NR, BASIS_RUECKMELDE_NR, BEZEICHNUNG
Sieht dann so aus:
128949, 0, Hauptgerät
128950, 128949, Steuerkarte A
128951, 128949, Steuerkarte B
128952, 128951, Steuerkarte C auf B
128953, 128951, Steuerkarte D auf B
Hauptgerät erkennt man daran das BASIS_RUECKMELDE_NR=0 ist. In den anderen Fällen steht dort die Rückmeldenummer von dem Gerät wo sie drin ist.
Die Auflösung nach Eingabe einer Rückmeldenummer -> Hauptgerät habe ich mit einer Funktion gelöst. Die relevante SQL-Abfrage sieht so aus:
WITH cte (RUECKMELDE_NR, BASIS_RUECKMELDE_NR) AS ( --SELECT für den Satz, von dem die Rekursion ausgehen soll: SELECT RUECKMELDE_NR, BASIS_RUECKMELDE_NR FROM XYZ WHERE RUECKMELDE_NR = 128980 UNION ALL --Rekursionsbedingung SELECT A.RUECKMELDE_NR, A.BASIS_RUECKMELDE_NR FROM XYZ AS A INNER JOIN cte B ON A.RUECKMELDE_NR=B.BASIS_RUECKMELDE_NR ) SELECT RUECKMELDE_NR AS Hauptauftrag from cte WHERE BASIS_RUECKMELDE_NR = 0
Für den Weg nach Eingabe der Hauptauftragsnummer alle Aufträge die dazugehören habe ich folgende Lösung gewählt:
In einer View wird die Hauptauftragsnummer über die Funktion erzeugt und ich kann dann in der WHERE-Bedingung auf die gesuchte Hauptauftragsnummer einschränken.
Die View muss dann aber für jeden einzelnen Auftrag in der Tabelle die Hauptauftragsnummer finden und dann kann der Datenbankserver die WHERE-Bedingung anwenden. Dauert bei sechstelliger Anzahl von Aufträgen einige Sekunden.
Kann man das nicht auch mit höherem Programmaufwand direkt über T-SQL realisieren? Müsste ich das programmieren (hab ich auch schon mal in C# gemacht):
1. Abfrage startend mit 128949 und diese Nummer in eine leere Lösungsliste eintragen.
2. Abfrage WHERE BASIS_RUECKMELDE_NR=128949. Liefert 128950 und 128951. Beide in Lösungsliste eintragen. Existiert ein Auftrag bereits wird der Auftrag nicht nochmal eingefügt, ist ja schon drin. Wobei es mir jetzt egal wäre, man kann ja später gruppieren
bzw. über distinct jeden Auftrag nur einmal ausgeben.
3. Abfrage mit beiden Lösungen aus 2: 128950 liefert kein Ergebnis. 128951 liefert 128952 und 128953. 128952 und 128953 in Lösungsliste einfügen.
4. Abfrage mit 128952 und dann 128953. Beides führt zu keinen weiteren Treffern.
5. Lösungsliste als Tabelle ausgeben.
Ich hoffe ich habe jetzt kein Fehler im Lösungsansatz drin.
Bekommt man sowas über SQL, CTE oder T-SQL programmiert?