Når du JOIN
to eller flere tabeller sammen, får du effektivt et kartesisk produkt til disse tabeller, hvortil et filter er angivet i JOIN
betingelse er anvendt.
Dette er mere indlysende, når du bruger en forældet implicit JOIN
syntaks.
LEFT JOIN
garanterer, at du ikke får mindre rækker end tabellen længst til venstre indeholder, dvs. e. hver række fra tabellen længst til venstre returneres mindst én gang.
Du kan stadig få flere rækker, hvis filteret ikke er en en-til-en række-mapping.
I dit tilfælde:
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 = ' '
enten acccount
eller product
er ikke unikke i b
eller c
.
For disse rækker:
a.account
1
2
3
b.account b.description
1 Account 1
2 Account 2 - old
2 Account 2 - new
, JOIN
returnerer følgende:
a.account b.account b.description
1 1 Account 1
2 2 Account 2 - old
2 2 Account 2 - new
3 NULL NULL
, hvilket giver dig flere rækker, end nogen af tabellerne indeholder.
For blot at vælge den første matchende beskrivelse fra en af tabellerne, brug denne:
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 = ' '
For at opdatere skal du blot omslutte forespørgslen i en indlejret visning:
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