-
Pack das Ganze in eine Klammer:
select * from (
Select *
From BESTELLP
Start With B1BNR02 = 7635561
Connect By Prior B1BNR01 = B1BNR02
) Hugo
where BINR02 = 0
oder
Select *
From BESTELLP
Start With B1BNR02 = 7635561
Connect By Prior B1BNR01 = B1BNR02
Order By BINR02
Fetch First Row Only
-
Hallo,
ich habe alle Varianten ausprobiert, bekomme aber immer den letzten Satz geliefert.
-
Ich hab hier was Cooles gefunden: Rekursives SQL
Scheint ab V5R4 zu gehen ...
PHP-Code:
WITH ABCDE (B1NR01,DATUM,B1NR02) AS (
SELECT B1NR01,DATUM,B1NR02 FROM BESTELLP WHERE B1NR01=7635561
UNION ALL
SELECT A.B1NR01,A.DATUM,A.B1NR02 FROM BESTELLP A
INNER JOIN ABCDE B ON A.B1NR01=B.B1NR02)
SELECT * FROM ABCDE WHERE B1NR02=0
-
Dies nennt sich rekursive CTE, was durch Connect By vereinfacht werden sollte.
Ich habe leider keine vergleichbaren Daten um dieses selber zu testen.
Warum die beiden letzten Varianten nicht funktionieren sollen, entzieht sich mir.
Immerhin liefert doch
Select *
From BESTELLP
Start With B1BNR02 = 7635561
Connect By Prior B1BNR01 = B1BNR02
eine Ergebnistabelle.
Warum sollten obige 2 Varianten also immer den letzten Satz liefern?
Mach doch mal schrittweise folgendes:
select * from (
Select *
From BESTELLP
Start With B1BNR02 = 7635561
Connect By Prior B1BNR01 = B1BNR02
) hugo
order by B1NR02
Wenn du dass dann mit "fetch first 1 rows only" oder "where B1NR02 = 0" ergänzt sollte das gewünschte Ergebnis doch eigentlich kommen.
-
Das rekursive CTE von Pikachu liefert das gewünscht Ergebnis(echt Cool!).
@ Fürchau: Ich habe das Statement schrittweise auseinander genommen, aber das Ergebnis war immer der letzte Satz. ehrlich
-
Dann wäre das ein meldenswerter Fehler an IBM, denn
select * from (
Select *
From BESTELLP
Start With B1BNR02 = 7635561
Connect By Prior B1BNR01 = B1BNR02
) hugo
where B1NR02 = 0
hätte dann gar keine Daten liefern dürfen.
Also irgendwas ist da faul...
-
Dieses Statement liefert eh keine Daten.
-
Wenn Du schon beim START WITH die Felder (aus meinem Beispiel) austauschst, musst Du dies auch beim CONNECT BY machen bzw. den PRIOR for das andere Feld setzen.
Das folgende Statement sollte das richtige Ergebnis liefern.
Code:
Select *
From YOURTABLE
Start With B1BNR02 = 7635561
Connect By Prior B1BNR02 = B1BNR01
Order By Level Desc
Fetch First Row Only
Mit einer RCTE geht das natürlich auch (seit Release V5R4) ist jedoch komplizierter und weniger einfach zu verstehen.
Birgitta
-
Danke vielmals, das war es.
-
Bei der CTE habe ich noch die Möglichkeit das Root-Element in jeden Satz zu übernehmen.
Geht das auch beim Connect by? Ich finde dazu nichts.
-
Mit Hilfe der Funktion Connect_By_Root bekommt man das Root-Element, das funktioniert auch korrekt bei mehreren Ausgangspunkten z.B.
Code:
Select Connect_By_Root(FldB), a.*
From MyTable
Start With FldB in ('A', 'B', 'C') Connect by Prior FldA = FldB;
Birgitta
-
Wohl dem, der schon V7R2 hat...
In V7R1 und V6R1 geht das leider nicht.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks