AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi LeftOuter Join mit Select verbessern?
Thema durchsuchen
Ansicht
Themen-Optionen

LeftOuter Join mit Select verbessern?

Ein Thema von Gruber_Hans_12345 · begonnen am 8. Jan 2008 · letzter Beitrag vom 8. Jan 2008
Antwort Antwort
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#1

LeftOuter Join mit Select verbessern?

  Alt 8. Jan 2008, 11:17
Datenbank: Firebird • Version: 2 • Zugriff über: IBConsole
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
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: LeftOuter Join mit Select verbessern?

  Alt 8. Jan 2008, 11:24
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;
Markus Kinzler
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: LeftOuter Join mit Select verbessern?

  Alt 8. Jan 2008, 14:01
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: LeftOuter Join mit Select verbessern?

  Alt 8. Jan 2008, 15:39
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
Heiko
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#5

Re: LeftOuter Join mit Select verbessern?

  Alt 8. Jan 2008, 16:09
@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
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: LeftOuter Join mit Select verbessern?

  Alt 8. Jan 2008, 16:37
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
Heiko
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#7

Re: LeftOuter Join mit Select verbessern?

  Alt 8. Jan 2008, 16:43
@hoika
ah ok, aber mein problem bleibt weiterhin, was passiert, wenn 2 oder mehr positionen passen, und ich nur die aktuelleste haben will?
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#8

Re: LeftOuter Join mit Select verbessern?

  Alt 8. Jan 2008, 16:48
Schau mal hier: Die Besten pro Gruppe
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:39 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