När du JOIN
två eller flera tabeller tillsammans, får du i praktiken en kartesisk produkt för dessa tabeller till vilken ett filter anges i JOIN
villkor tillämpas.
Detta är mer uppenbart när du använder en föråldrad implicit JOIN
syntax.
LEFT JOIN
garanterar att du inte får mindre rader än tabellen längst till vänster innehåller, dvs. e. varje rad från tabellen längst till vänster returneras minst en gång.
Du kan fortfarande få fler rader om filtret inte är en en-till-en-radmappning.
I ditt 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 = ' '
antingen acccount
eller product
är inte unika i b
eller c
.
För dessa rader:
a.account
1
2
3
b.account b.description
1 Account 1
2 Account 2 - old
2 Account 2 - new
, JOIN
returnerar följande:
a.account b.account b.description
1 1 Account 1
2 2 Account 2 - old
2 2 Account 2 - new
3 NULL NULL
, vilket ger dig fler rader än någon av tabellerna innehåller.
För att bara välja den första matchande beskrivningen från någon av tabellen, använd detta:
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 = ' '
För att uppdatera, linda bara in frågan i en inline-vy:
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