Wenn Sie JOIN werden zwei oder mehr Tabellen zusammen, erhalten Sie effektiv ein kartesisches Produkt für diese Tabellen, zu denen ein Filter im JOIN angegeben ist Bedingung wird angewendet.
Dies wird deutlicher, wenn Sie ein veraltetes implizites JOIN verwenden Syntax.
Der LEFT JOIN garantiert, dass Sie nicht weniger bekommen Zeilen als die Tabelle ganz links enthält, d. e. Jede Zeile der Tabelle ganz links wird mindestens einmal zurückgegeben.
Sie können immer noch mehr Zeilen erhalten, wenn der Filter keine Eins-zu-Eins-Zeilenzuordnung ist.
In Ihrem Fall:
SELECT (b.descr || ' - ' || c.descr) description
FROM tbl1 a
LEFT JOIN
tbl2 b
ON b.ACCOUNT = a.ACCOUNT
LEFT JOIN
tbl3 c
ON c.product = a.product
WHERE a.descr50 = ' '
entweder acccount oder product sind in b nicht eindeutig oder c .
Für diese Zeilen:
a.account
1
2
3
b.account b.description
1 Account 1
2 Account 2 - old
2 Account 2 - new
, das JOIN gibt Folgendes zurück:
a.account b.account b.description
1 1 Account 1
2 2 Account 2 - old
2 2 Account 2 - new
3 NULL NULL
, wodurch Sie mehr Zeilen erhalten, als jede der Tabellen enthält.
Um einfach die erste passende Beschreibung aus einer der Tabellen auszuwählen, verwenden Sie Folgendes:
SELECT (
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl2 b
WHERE b.account = a.account
AND rownum = 1
) || ' - ' ||
(
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl3 c
WHERE c.product= a.product
AND rownum = 1
) description
FROM tbl1 a
WHERE a.descr50 = ' '
Zum Aktualisieren packen Sie die Abfrage einfach in eine Inline-Ansicht:
UPDATE (
SELECT (
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl2 b
WHERE b.account = a.account
AND rownum = 1
) || ' - ' ||
(
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl3 c
WHERE c.product= a.product
AND rownum = 1
) description
FROM tbl1 a
WHERE a.descr50 = ' '
)
SET descr50 = description