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