Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   rekursives select (https://www.delphipraxis.net/159079-rekursives-select.html)

Berni68 13. Mär 2011 15:48

Datenbank: firebird • Version: 2.1 • Zugriff über: IBDAC

rekursives select
 
Hallo zusammen,

ich habe ein Problem bei folgender select Anweisung:
Code:
with recursive x (id, ref, Anz, Artikel) as
(
select
  s.modell, s.referenz, s.anz, m.partnumber
  from stueckliste s
  join modelle m on m.id = s.referenz
  where s.modell = :id
union all
select
  s.modell, s.referenz, s.anz, m.partnumber
  from stueckliste s
  join modelle m on m.id = s.referenz
  inner join x on s.modell = x.ref
)
select * from x
die prinzipiell die gewünschten Datensätze liefert z.B.:
Code:
ID   REF   ANZ   ARTIKEL
646   680   4   ohne
646   682   2   500738
646   681   4   ohne
646   683   1   500740
646   684   1   500741
646   685   1   500742
646   687   1   500744   <-diese Zeile unterdrücken
687   686   3   500743   x
687   645   1   500690   x
687   688   1   500747   x
687   689   1   500748   x
687   736   2   500793   x
646   690   1   500746
646   696   4   500756
646   727   2   500761
646   728   2   500762
Jedoch sollte die gekennzeichnete Zeile nicht enthalten sein,
da sie durch die folgenden mit x gekennzeichneten Zeilen vertreten ist (Stücklisten/Teilelisten-Thema)
Als Kriterium könnte man sagen:
Zeile nicht ausgeben wenn Wert der Spalte REF in Spalte ID vorhanden ist.
Aber ich krieg das einfach nicht in das SQL-Statement.

omata 13. Mär 2011 16:08

AW: rekursives select
 
SQL-Code:
with recursive x (id, ref, Anz, Artikel) as
(
select
  s.modell, s.referenz, s.anz, m.partnumber
  from stueckliste s
  join modelle m on m.id = s.referenz
  where s.modell = :id
union all
select
  s.modell, s.referenz, s.anz, m.partnumber
  from stueckliste s
  join modelle m on m.id = s.referenz
  inner join x on s.modell = x.ref
)
SELECT * 
FROM x x1
WHERE NOT EXISTS (SELECT *
                  FROM x
                  WHERE id = x1.ref)

Berni68 13. Mär 2011 16:20

AW: rekursives select
 
vielen Dank, klappt wunderbar!

Verstehe allerdings nicht warum. Was ist das für ein x1 ?

chaosben 13. Mär 2011 16:46

AW: rekursives select
 
Das x1 hat er, als ordentlicher Programmierer, pro forma hingeschrieben.
Technisch ist es nicht nötig. Man macht das einfach so. :-)

omata 13. Mär 2011 16:59

AW: rekursives select
 
Zitat:

Zitat von chaosben (Beitrag 1088141)
Technisch ist es nicht nötig.

Das ist sehr wohl nötig! Es ist der Name für die "äußere" Tabelle (x), sonst wäre keine Unterscheidung zwischen "äußerem" X und "innerem" X möglich.

chaosben 13. Mär 2011 17:03

AW: rekursives select
 
Oh verflixt ... mein Fehler.
Und die Moral von der Geschicht: Man kann schneller tippen als denken. :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:31 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