Cuando JOIN
dos o más tablas juntas, efectivamente obtiene un producto cartesiano para estas tablas a las que se les indica un filtro en JOIN
se aplica la condición.
Esto es más obvio cuando usa un JOIN
implícito obsoleto sintaxis.
El LEFT JOIN
garantiza que no obtiene menos filas que contiene la tabla más a la izquierda, i. mi. cada fila de la tabla más a la izquierda se devuelve al menos una vez.
Todavía puede obtener más filas, si el filtro no es una asignación de fila uno a uno.
En su 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 = ' '
ya sea acccount
o product
no son únicos en b
o c
.
Para estas filas:
a.account
1
2
3
b.account b.description
1 Account 1
2 Account 2 - old
2 Account 2 - new
, el JOIN
devolverá lo siguiente:
a.account b.account b.description
1 1 Account 1
2 2 Account 2 - old
2 2 Account 2 - new
3 NULL NULL
, brindándole más filas que las que contiene cualquiera de las tablas.
Para seleccionar la primera descripción coincidente de cualquiera de las tablas, use esto:
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 = ' '
Para actualizar, simplemente envuelva la consulta en una vista en línea:
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