Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi LeftOuter Join mit Select verbessern? (https://www.delphipraxis.net/106271-leftouter-join-mit-select-verbessern.html)

Gruber_Hans_12345 8. Jan 2008 10:17

Datenbank: Firebird • Version: 2 • Zugriff über: IBConsole

LeftOuter Join mit Select verbessern?
 
Kann man solche Abfragen irgendwie Eleganter lösen?

Es gibt einen Eintrag in STEUCKLISTEN_TEILE, zu dem mehrere Einträge in VORGANG_AUFTRAG_POSITION gehören
zu jedem VORGANG_AUFTRAG_POSITION gibt es genau einen VORGANG_AUFTRAG eintrag gibt

Nun möchte ich den letzten (ist der aktuelle) Eintrag aus der VORGANG_AUFTRAG_POSITION anzeigen (es darf nur genau ein Datensatz pro Teil sein)

Ich komme nur auf das, aber vermute mal, das eine zusätzliche SELECT im LEFT OUTER JOIN auch eine gewisse Bremse ist, aber mit Group und co, komme ich nicht auf das Ergebnis hin ...

SQL-Code:
SELECT VA.NUMMER, VA.STATUS, VAP.ID, VAP.MENGE, T.*
FROM STEUCKLISTEN_TEILE T
LEFT OUTER JOIN VORGANG_AUFTRAG_POSITION VAP ON VAP.ID = (SELECT FIRST 1 VAP.ID FROM VORGANG_AUFTRAG_POSITION VAP WHERE VAP.TEILID = T.ID ORDER BY VAP.ID DESC)
LEFT OUTER JOIN VORGANG_AUFTRAG VA ON VA.ID = VAP.PARENTID

mkinzler 8. Jan 2008 10:24

Re: LeftOuter Join mit Select verbessern?
 
Ich vermute mal nicht, aber versuch mal:

SQL-Code:
SELECT
    VA.NUMMER, VA.STATUS, VAP.ID, VAP.MENGE, T.*
FROM
    STEUCKLISTEN_TEILE T
        LEFT OUTER JOIN VORGANG_AUFTRAG_POSITION VAP ON MAX(VAP.ID)  
        LEFT OUTER JOIN VORGANG_AUFTRAG VA ON VA.ID = VAP.PARENTID;

omata 8. Jan 2008 13:01

Re: LeftOuter Join mit Select verbessern?
 
Hier mal mein Vorschlag...

SQL-Code:
SELECT va.nummer, va.status, vap.id, vap.menge, t.*
FROM steucklisten_teile t
LEFT JOIN vorgang_auftrag_position vap
  ON t.id = vap.teilid
LEFT JOIN vorgang_auftrag va
  ON va.id = vap.parentid
WHERE vap.teilid = (SELECT MAX(id)
                    FROM vorgang_auftrag_position
                    WHERE teilid = vap.teilid)
und noch einer...
SQL-Code:
SELECT va.nummer, va.status, vap.id, vap.menge, t.*
FROM steucklisten_teile t
LEFT JOIN (SELECT * 
           FROM vorgang_auftrag_position vap
           WHERE teilid = (SELECT MAX(id)
                           FROM vorgang_auftrag_position
                           WHERE teilid = vap.teilid)) vap
  ON t.id = vap.teilid
LEFT JOIN vorgang_auftrag va
  ON va.id = vap.parentid
Gruss
Thorsten

hoika 8. Jan 2008 14:39

Re: LeftOuter Join mit Select verbessern?
 
Hallo,

das beste wäre ein Verzicht auf das left join.

Das geht mit Dummy-Records in den verknüpften Tabellen,
z.B. hat dann jede Stückliste immer eine leere Dummy-Position,
dei wird mit dem 1. Eintragen eines richtigen Wertes gelöscht.

Dann kann man ein einfachen Join benutzen.


Heiko

Gruber_Hans_12345 8. Jan 2008 15:09

Re: LeftOuter Join mit Select verbessern?
 
@mkinzler: das mag Firbird leider nicht, da schreit er bei zweiten LEFT bzw beim Befehl, der nach dem MAX kommt.

@omata: da habe ich bei beiden das geliche problem, das Firebird pro Datensatz, der rauskommt, mindestens eine weitere SELECT braucht

@hoika: das habe ich irgendwie gar nicht verstanden, was du meinst? - es wird zwar schwierig in meinem fall zusätzliche dummy Einträge zu machen, aber würde es trotzdem gerne verstehen, was du meinst, vielleicht meinst ja was ganz anders, oder es hilft wo anders mal :)

hoika 8. Jan 2008 15:37

Re: LeftOuter Join mit Select verbessern?
 
Hallo,

Bsp Auftrag / Auftragspos
gesucht alle Positionen aller Aufträge

ohne Dummy
left join, weil viell. ein Auftrag noch keine Position hat.


mit Dummy
jeder Auftrag erhält schon beim Anlegen eine einzelne Position,
der Daten sind sinnvollerweise NULL

Jetzt kann man einen (inner) join machen,
bei Aufträgen mit existierenden Pos werden die brav angezeigt

bei Aufträgen noch mit keiner Pos
wird die Dummy-Position verwendet.


Inner Joins sind sehr viel schneller als Left Joins


Heiko

Gruber_Hans_12345 8. Jan 2008 15:43

Re: LeftOuter Join mit Select verbessern?
 
@hoika
ah ok, aber mein problem bleibt weiterhin, was passiert, wenn 2 oder mehr positionen passen, und ich nur die aktuelleste haben will?

DeddyH 8. Jan 2008 15:48

Re: LeftOuter Join mit Select verbessern?
 
Schau mal hier: Die Besten pro Gruppe


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