Oracle
 sql >> Database >  >> RDS >> Oracle

Ottenere righe extra - Dopo aver unito le 3 tabelle usando Left Join

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