Quando JOIN
due o più tabelle insieme, ottieni effettivamente un prodotto cartesiano per queste tabelle a cui un filtro indicato nel JOIN
condizione è applicata.
Questo è più ovvio quando usi un JOIN
implicito obsoleto sintassi.
Il LEFT JOIN
ti garantisce di non ricevere meno righe rispetto a quelle contenute nella tabella più a sinistra, i. e. ogni riga della tabella più a sinistra viene restituita almeno una volta.
Puoi comunque ottenere più righe, se il filtro non è un mapping di riga uno a uno.
Nel tuo caso:
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 = ' '
o acccount
o product
non sono univoci in b
o c
.
Per queste righe:
a.account
1
2
3
b.account b.description
1 Account 1
2 Account 2 - old
2 Account 2 - new
, il JOIN
restituirà quanto segue:
a.account b.account b.description
1 1 Account 1
2 2 Account 2 - old
2 2 Account 2 - new
3 NULL NULL
, dandoti più righe di quante ne contenga una delle tabelle.
Per selezionare la prima descrizione corrispondente da una delle due tabelle, usa questo:
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 = ' '
Per aggiornare, avvolgi la query in una vista in linea:
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