![]() |
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 |
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; |
Re: LeftOuter Join mit Select verbessern?
Hier mal mein Vorschlag...
SQL-Code:
und noch einer...
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)
SQL-Code:
Gruss
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 Thorsten |
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 |
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 :) |
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 |
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? |
Re: LeftOuter Join mit Select verbessern?
Schau mal hier:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz