PDA

View Full Version : SQL mit fetch first 1 row only gibt kein result zurück



itec01
23-07-21, 10:13
Hallo Zusammen,
Ich habe zwei Tabellen, die eine wird gelesen und aus der zweiten soll die Rechnungsnummer (CHAR) dazu angezeigt werden. Da aber die 2. Tabelle mehr Sätze enthält als die erste wollte ich mit dem Fetch first 1 row only mir die Nummer aus der 2. Tabelle holen und zwar nur einmal.
Leider werden überhaupt keine Daten angezeigt. Was mache ich falsch?
SQL:
select p1.brc1batn, p2.pirinv, p2.pibatn from speitec.brctrnq1 as p1
inner join (select pibatn, pirinv from spefil.pitrnp fetch first 1 row only) as p2 on p2.pibatn = p1.brc1batn;
Führe ich das SQL aus, wird gar kein Satz angezeigt.
Lasse ich den fetch weg, sprich
select p1.brc1batn, pirinv, pibatn from speitec.brctrnq1 as p1
inner join (select pibatn, pirinv from spefil.pitrnp) as p2 on p2.pibatn = p1.brc1batn;

werden die Daten angezeigt, aber halt mehrfach.

330976 03956 330976
330976 03956 330976
330976 03956 330976

Danke schonmal.
Gruß Klaus

Fuerchau
23-07-21, 10:25
Leider funktioniert ein "fetch first 1 rows only" nicht im Join, da dieser generell nur mit dem 1. Satz der gesamten Tabelle überhaupt durchgeführt wird.

Es gibt allerdings (je nach Release) folgende Möglichkeit:

select * from file1
cross join lateral table (
select * from file2 where file1.key = file2.key
fetch first 1 rows only
) f2

Ein Lateral-Zugriff wird tatsächlich je Zeile ausgeführt.

itec01
23-07-21, 10:35
Super, vielen Dank. So hat es nun funktioniert:
select p1.brc1batn, p2.pirinv, p2.pibatn from speitec.brctrnq1 p1
cross join lateral (select * from spefil.pitrnp where p1.brc1batn = pibatn fetch first 1 rows only) p2;

itec01
23-07-21, 10:51
Vielleicht kannst du mir noch beim update SQL helfen. Irgendwie will das nicht so klappen, sprich:
update speitec.brctrnq1 p1 set invnbr = Ergebnis aus dem SQL mit dem cross join lateral.

Danke.

Fuerchau
23-07-21, 11:06
Beim Update klappt das wieder mit dem fetch first..., da es sich um einen scalaren Subselect und keinen Join handelt:

update myfile a
set f1 = (
select f1 from file2 b inner join file3 c on b.key = c.key
where a.key = b.key
fetch first 1 rows only)

where exists (select * from file2 e where e.key=a.key)

Der scalare subselect wird hier wieder je Zeie ausgeführt.
Die Schluss-Whereklausel ist u.U. erforderlich, wenn der Subslect den Schlüssel nicht findet.

Falls mehrere Felder geändert werden sollen:

set (f1, f2, f3) = (select f1, f2, f3 from ....)

itec01
23-07-21, 12:37
Super, vielen Dank. Hat geklappt.

Fuerchau
23-07-21, 14:06
Und das trotz meiner Tippfehler;-).