Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   verschachtelte Query (https://www.delphipraxis.net/204076-verschachtelte-query.html)

Ykcim 21. Apr 2020 15:18

Datenbank: MySQL • Version: 5 • Zugriff über: UniDac

verschachtelte Query
 
Hallo Zusammen,

der Titel ist etwas nichtssagend, aber ich wusste nicht, wie ich es prägnant betiteln könnte...

Ich habe eine Tabelle, in der alle Komponenten, die für die Produktion eines Artikel benötigt werden, aufgelistet sind. Bedauerlicher Weise ist diese liste aber mehrdimensional.

ArtikelNr
----Werkzeug-Hauptsatz (für jede mögliche Maschine gibt es einen)
--------Werkzeug-Baugruppe (die Teil des Werkzeug-Hauptsatzes ist) (Es kann aber auch ein Einzelwerkzeug sein, dass zum Werkzeug-Hauptsatz gehört)
------------Einzelwerkzeug (das zur Werkzeug-Baugruppe gehört)

Die Tabelle hat nur 2 relevante Spalten, nämlich STBGNR und STKOMP.
Aussehen tut das Ganze ähnlich diesem Beispiel:

STBGNR----STKOMP
4711--------4711MD06 (ArtikelNr-----WerkzeugHauptsatz)
4711MD06--78945 (WerkzeugHauptsatz-----Baugruppe oder Einzelwerkzeug)
78945-------75523 (Baugruppe-----Einzelwerkzeug)

Es gibt keinerlei Anhaltspunkte in der Nummer, um was es sich handelt. Bis auf der WerkzeugHauptsatz kann alles eine Baugruppe oder ein Einzelerkzeug sein.
Die Tabelle beinhaltet über 200.000 Datensätze.

Ich möchte eine Query schreiben, in der ich alle WerkzeugBaugruppen und Einzelwerkzeuge, die für eine Auswahl an Artikeln benötigt werden, aufgelistet bekomme.

Ich habe dafür keinen Ansatz, den ich hier posten könnte. Aktuell würde ich viele einzelne Query's schreiben, die ich mit dem Ergebnis der vorherigen zusammenbauen würde und dann das Ergebnis aus den Teilergebnissen zusammensetzen müsste. Kein schöner Weg, daher frage ich Euch, ob jemand einen schlaueren aber dennoch performanten Weg kennt.

Vielen Dank für's Mitdenken
Patrick

Sinspin 21. Apr 2020 15:47

AW: verschachtelte Query
 
Hallo. Die Anzahl der Ebenen ist fix? Also immer drei? Dann könntest Du mit
Code:
JOIN
arbeiten.
Ansonsten gibt es noch die Möglichkeit ne StoredProcedure zu schreiben. Das ist in den meißten Fällen immernoch schneller als zig einzelne Abfragen übers Neztzwerk zu zerren.
Letzte Option, wie oft ändert sich die Tabelle und wie groß ist sie? Bzw, wie oft musst Du zugreifen? Für bestimmte Sachen arbeite ich mit einer lokalen Pufferung der gesamten Tabelle.

Ykcim 21. Apr 2020 16:03

AW: verschachtelte Query
 
Hallo Stefan,

die Tabelle verändert sich ständig und die Zugriffe sind sehr variabel.
Ich habe auch feststellen müssen, dass die Levels nicht immer fix 3 sind...

Ich habe jetzt folgenden Ansatz gefunden, der die Anzahl der Query's vielleicht reduziert.

Delphi-Quellcode:
SELECT WH.stbgnr,
       WH.stkomp as HGR, //Hauptgruppe
       BG.stkomp as BGR, //Baugruppe
       UG.stkomp as UGR, //Untergruppe
       WZ.stkomp as EWZ, //Einzelwerkzeug
       RS.stkomp as Rest //Falls es noch ein Level gibt
FROM phstru WH
left join phstru BG on BG.stbgnr=WH.stkomp
left join phstru UG on UG.stbgnr=BG.stkomp
left join phstru WZ on WZ.stbgnr=UG.stkomp
left join phstru RS on RS.stbgnr=WZ.stkomp
where WH.stbgnr like '%10022439SD73' //ArtikelNr und MaschinenNr
and wh.tamagr regexp '3100|3500|5100' //Materialgruppen, um das Ergebnis einzugrenzen
Damit bekomme ich jedenfalls eine Liste über 5 Spalten, aus den ich mir das Ergebnis zusammenbauen könnte und die Query ist auch noch sehr schnell...

TigerLilly 21. Apr 2020 20:53

AW: verschachtelte Query
 
Klingt nach unbekannter Verschachtelungstiefe aka Rekursion:

https://phpperformance.de/server/dat...ysql-rekursion
https://www.ptmr.io/blog/hierarchie-...uery-abfragen/
http://www.klempert.de/nested_sets/

himitsu 21. Apr 2020 23:20

AW: verschachtelte Query
 
https://stackoverflow.com/questions/...ecursive-query

SQL-Code:
with recursive temptablename (id, name, parent_id) as (
  select    id, name, parent_id
  from      products
  where     parent_id = 19  -- Initialisierung

  union all
  select    p.id, p.name, p.parent_id
  from      products p
  inner join temptablename
  on        p.parent_id = temptablename.id -- Rekursion

)
select * from temptablename;


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