Seite 1 von 1

Left Join nur 1 Satz

Verfasst: Di, 07. Feb 2023 7:15
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?

Re: Left Join nur 1 Satz

Verfasst: Di, 07. Feb 2023 7:22
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

Re: Left Join nur 1 Satz

Verfasst: Di, 07. Feb 2023 8:11
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 

Re: Left Join nur 1 Satz

Verfasst: Di, 07. Feb 2023 8:21
von Manfred
Mist, ich muß mich daran gewöhnen, das man ja vieles noch mit weiteren Selects ermitteln kann.

Re: Left Join nur 1 Satz

Verfasst: Di, 16. Jan 2024 10:24
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.

Re: Left Join nur 1 Satz

Verfasst: Di, 16. Jan 2024 10:32
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

Re: Left Join nur 1 Satz

Verfasst: Mo, 22. Jan 2024 16:07
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?

Re: Left Join nur 1 Satz

Verfasst: Mo, 22. Jan 2024 17:13
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...

Re: Left Join nur 1 Satz

Verfasst: Mo, 22. Jan 2024 18:13
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!?

Re: Left Join nur 1 Satz

Verfasst: Di, 23. Jan 2024 9:35
von nightcrawler
ROWID ändert sich bei Einfügen.....dann hat ein neuer Satz nicht unbedingt die höchste. Nimm lieber ein Autoinc o.ä.

Re: Left Join nur 1 Satz

Verfasst: Di, 23. Jan 2024 9:41
von Manfred
das ist aber noch eine DBF und da sehe ich kein autoinc

Re: Left Join nur 1 Satz

Verfasst: Di, 23. Jan 2024 11:59
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.

Re: Left Join nur 1 Satz

Verfasst: Di, 23. Jan 2024 12:25
von Manfred
OK,
eigene ID war das Stichwort. Sowas gibt es schon.

Re: Left Join nur 1 Satz

Verfasst: Di, 23. Jan 2024 12:33
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.

Re: Left Join nur 1 Satz

Verfasst: Di, 23. Jan 2024 12:52
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?

Re: Left Join nur 1 Satz

Verfasst: Di, 23. Jan 2024 12:55
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

Re: Left Join nur 1 Satz

Verfasst: Di, 23. Jan 2024 12:57
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

Re: Left Join nur 1 Satz

Verfasst: Di, 23. Jan 2024 12:58
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