Wanneer u JOIN
twee of meer tafels samen, krijgt u in feite een cartesiaans product voor deze tabellen waarop een filter vermeld staat in de JOIN
voorwaarde is toegepast.
Dit is duidelijker wanneer u een verouderde impliciete JOIN
. gebruikt syntaxis.
De LEFT JOIN
garandeert dat u niet minder . krijgt rijen dan de meest linkse tabel bevat, i. e. elke rij van de meest linkse tabel wordt minstens één keer geretourneerd.
U kunt nog steeds meer rijen krijgen als het filter geen één-op-één rijtoewijzing is.
In jouw geval:
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 = ' '
ofwel acccount
of product
zijn niet uniek in b
of c
.
Voor deze rijen:
a.account
1
2
3
b.account b.description
1 Account 1
2 Account 2 - old
2 Account 2 - new
, de JOIN
geeft het volgende terug:
a.account b.account b.description
1 1 Account 1
2 2 Account 2 - old
2 2 Account 2 - new
3 NULL NULL
, waardoor u meer rijen krijgt dan een van de tabellen bevat.
Gebruik dit om de eerste overeenkomende beschrijving uit beide tabellen te kiezen:
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 = ' '
Om bij te werken, plaatst u de zoekopdracht in een inline-weergave:
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