Left Join nur 1 Satz

Alles zum SQL-Dialekt

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Left Join nur 1 Satz

Beitrag von Manfred »

folgendes Szenario:

Code: Alles auswählen

SELECT tb1.*,
tb2.*
FROM tabelle1 tb1
LEFT JOIN tabelle2 tb2 ON tb2.idtb1 = tb1.id
Jetzt kann es vorkommen, das in tb2 mehr Daten zu tb1 ist. Es soll aber immer nur der letzte Eintrag genommen werden, bzw. nur dann, wenn er auch einem bestimmtem Kriterium entspricht. Wenn keiner gefunden wird, dann gibt es eben leere Felder.
Wie macht man sowas?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Left Join nur 1 Satz

Beitrag von Martin Altmann »

Stichworte LEFT, RIGHT, FULL, INNER und OUTER bei Join. Schau da mal nach.
Oder hier kurz erklärt: https://www.freecodecamp.org/news/sql-j ... n-example/

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Left Join nur 1 Satz

Beitrag von Marcus Herz »

Es soll aber immer nur der letzte Eintrag genommen werden,
Das ist tricky, versuchs mal damit, aber es hängt vom Datenvolumen ab, ob das noch performant ist.

Code: Alles auswählen

SELECT tb1.*,
tb2.*
FROM tabelle1 tb1
LEFT JOIN tabelle2 tb2 ON tb2.idtb1 = tb1.id and tb2.<maxfield> = (select max(<maxfield>) from tabelle2 t where t.idtb1 = tb2.tbid1)
Oder ein Unterselect

Code: Alles auswählen

SELECT tb1.*,
tb2.*
FROM tabelle1 tb1
LEFT JOIN (select *
	from tabelle2
	where rowid in
	(select max(rowid)
	from tabelle2
  group by idtb1, <maxfield>) tb2 ON tb2.idtb1 = tb1.id 
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Left Join nur 1 Satz

Beitrag von Manfred »

Mist, ich muß mich daran gewöhnen, das man ja vieles noch mit weiteren Selects ermitteln kann.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Left Join nur 1 Satz

Beitrag von Manfred »

ich habe das immer noch nicht so ganz verstanden.

Code: Alles auswählen

SELECT td.id,
       td.checkin,
       td.datum,
       td.idfahrer,
       td.name,
       td.nummer,
       td.dienstbez,
       td.zeitvon,
       td.gueltigbez,
       td.usertime,
       ba.kuerzel,
       ezd.kfznr,
       ezd.breitengrad,
      ezd.laengengrad,
      ezd.linienname,
      ezd.letztekommunikation,
      ezd.fahrtname,
      fa.mobil,
      fz.datumtank,
      fz.tankmenge,
      re.datumbis
FROM tagesdienst td
left join gemeinsamedaten.fahrer fa on fa.id = td.idfahrer
LEFT JOIN betriebshof ba ON ba.id = td.idhofab
left Join gemeinsamedaten.echtzeitdaten ezd on ezd.nummer = fa.nummer
LEFT JOIN fahrzeuge fz on fz.kfznr=ezd.kfznr
left join reinigung re on re.idfahrzeug=fz.id    <---- das hier liefert mir zu viel zurück. Ich bräuchte nur 1 Satz und zwar den jüngsten Eintrag
WHERE td.datum = '2024-01-16' AND td.webfrei 
ORDER BY td.dienstbez, re.datumbis DESC
in dem Left Join ein SELECT!? aber wie? ich breche mir einen ab dabei.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Left Join nur 1 Satz

Beitrag von Marcus Herz »

Code: Alles auswählen

SELECT td.id,
       td.checkin,
       td.datum,
       td.idfahrer,
       td.name,
       td.nummer,
       td.dienstbez,
       td.zeitvon,
       td.gueltigbez,
       td.usertime,
       ba.kuerzel,
       ezd.kfznr,
       ezd.breitengrad,
      ezd.laengengrad,
      ezd.linienname,
      ezd.letztekommunikation,
      ezd.fahrtname,
      fa.mobil,
      fz.datumtank,
      fz.tankmenge,
      re.datumbis
FROM tagesdienst td
left join gemeinsamedaten.fahrer fa on fa.id = td.idfahrer
LEFT JOIN betriebshof ba ON ba.id = td.idhofab
left Join gemeinsamedaten.echtzeitdaten ezd on ezd.nummer = fa.nummer
LEFT JOIN fahrzeuge fz on fz.kfznr=ezd.kfznr
// z.B. je IDFahrzeug das max Datum, ergibt dann einen Satz, von der Annahme ausgehend, dass der letzte Satz das neueset Datum enthält
left join (select idfahrzeug, max(datumbis) datumbis from  reinigung group by 1 )  re on re.idfahrzeug=fz.id    

<---- das hier liefert mir zu viel zurück. Ich bräuchte nur 1 Satz und zwar den jüngsten Eintrag
WHERE td.datum = '2024-01-16' AND td.webfrei 
ORDER BY td.dienstbez, re.datumbis DESC
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Left Join nur 1 Satz

Beitrag von Manfred »

sorry,
aber ich kapier es einfach nicht. Ich brauche aus der Reinigung noch mehr Felder für die Anzeige. Wie komme ich da dran?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Left Join nur 1 Satz

Beitrag von Marcus Herz »

Sorry, dann so (in deinem Beispiel war nur 1 Feld aus reinigung)

Code: Alles auswählen

SELECT td.id,
       td.checkin,
       td.datum,
       td.idfahrer,
       td.name,
       td.nummer,
       td.dienstbez,
       td.zeitvon,
       td.gueltigbez,
       td.usertime,
       ba.kuerzel,
       ezd.kfznr,
       ezd.breitengrad,
      ezd.laengengrad,
      ezd.linienname,
      ezd.letztekommunikation,
      ezd.fahrtname,
      fa.mobil,
      fz.datumtank,
      fz.tankmenge,
      re.datumbis
FROM tagesdienst td
left join gemeinsamedaten.fahrer fa on fa.id = td.idfahrer
LEFT JOIN betriebshof ba ON ba.id = td.idhofab
left Join gemeinsamedaten.echtzeitdaten ezd on ezd.nummer = fa.nummer
LEFT JOIN fahrzeuge fz on fz.kfznr=ezd.kfznr
// z.B. je IDFahrzeug das max Datum, ergibt dann einen Satz, von der Annahme ausgehend, dass der letzte Satz das neueset Datum enthält
left join (select * from  reinigung  where rowid in (select max(rowid) from reinigung group by idfahrzeug ))  re on re.idfahrzeug=fz.id    

<---- das hier liefert mir zu viel zurück. Ich bräuchte nur 1 Satz und zwar den jüngsten Eintrag
WHERE td.datum = '2024-01-16' AND td.webfrei 
ORDER BY td.dienstbez, re.datumbis DESC
Das kann ich jetzt aber nicht mehr testen...
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Left Join nur 1 Satz

Beitrag von Manfred »

Marcus,
nicht Dein Fehler. Zu dem Zeitpunkt wußte ich nicht, das ich mehr Felder benötige, deshalb standen die auch nicht in der Vorgabe. Aber so wie es jetzt aussieht, ist es richtig. Jetzt kann ich auch weitere felder hinzufügen. Wobei das aber jetzt auch nur für den letzten Satz gilt, da er dann passend zum Fahrzeug die höchste rowid hat.. Wenn ich andere Group by bilden müßte, dann würde das nicht klappen!?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Left Join nur 1 Satz

Beitrag von nightcrawler »

ROWID ändert sich bei Einfügen.....dann hat ein neuer Satz nicht unbedingt die höchste. Nimm lieber ein Autoinc o.ä.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Left Join nur 1 Satz

Beitrag von Manfred »

das ist aber noch eine DBF und da sehe ich kein autoinc
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Left Join nur 1 Satz

Beitrag von nightcrawler »

Data Dictionary? Falls ja, baue Dir ein Autoinc über einen Trigger;)
Oder verwende eine eigene, eindeutige ID. Wie gesagt: ROWID ist die Position des Datensatzes in der Tabelle und stellt nicht die Reihenfolge sicher.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Left Join nur 1 Satz

Beitrag von Manfred »

OK,
eigene ID war das Stichwort. Sowas gibt es schon.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Left Join nur 1 Satz

Beitrag von Manfred »

hm, und wie muß dann der Befehl lauten? einfach nur austauschen ROWID gegen id ist es ja nicht, oder? Zumindest stimmt dann das Ergebnis nicht mehr überein.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Left Join nur 1 Satz

Beitrag von nightcrawler »

habs jetzt nicht komplett durchgelesen....aber
left join reinigung re on re.idfahrzeug=fz.id
<---- das hier liefert mir zu viel zurück. Ich bräuchte nur 1 Satz und zwar den jüngsten Eintrag
wie identifizierst Du den jüngsten Eintrag?
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Left Join nur 1 Satz

Beitrag von Manfred »

so ist mein aktueller Befehl

Code: Alles auswählen

SELECT fz.kfznr,
       re.datumbis,
	   re.id,
       SubString(re.zeitbis,1,5) AS zeitbis,
       SubString(re.zeitvon,1,5) AS zeitvon,
       fa.name,
       fa.vorname
FROM fahrzeuge fz
left join (select * from  reinigung  where rowid in (select max(rowid) from reinigung group by idfahrzeug ))  re on re.idfahrzeug=fz.id
left Join fahrer fa on fa.nummer = re.nummer
where fz.kfznr = 40
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Left Join nur 1 Satz

Beitrag von Manfred »

das hier klappt auch, gibt aber was anderes zurück

Code: Alles auswählen

SELECT fz.kfznr,
       re.datumbis,
	   re.id,
       SubString(re.zeitbis,1,5) AS zeitbis,
       SubString(re.zeitvon,1,5) AS zeitvon,
       fa.name,
       fa.vorname
FROM fahrzeuge fz
left join (select * from  reinigung where id in (select max(id) from reinigung group by idfahrzeug ))  re on re.idfahrzeug=fz.id
left Join fahrer fa on fa.nummer = re.nummer
where fz.kfznr = 40
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Left Join nur 1 Satz

Beitrag von Manfred »

ist ja auch logisch, max(id) kann ja nicht klappen, weil es ja nicht der letzte Satz wäre. Hier ist ID = uuid
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten