sql >> Base de Datos >  >> RDS >> Oracle

Obtener filas adicionales:después de unir las 3 tablas usando Left Join

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