sql >> Database >  >> RDS >> Oracle

Extra rijen krijgen - Nadat u lid bent geworden van de 3 tafels met behulp van Left Join

Wanneer u JOIN twee of meer tafels samen, krijgt u in feite een cartesiaans product voor deze tabellen waarop een filter vermeld staat in de JOIN voorwaarde is toegepast.

Dit is duidelijker wanneer u een verouderde impliciete JOIN . gebruikt syntaxis.

De LEFT JOIN garandeert dat u niet minder . krijgt rijen dan de meest linkse tabel bevat, i. e. elke rij van de meest linkse tabel wordt minstens één keer geretourneerd.

U kunt nog steeds meer rijen krijgen als het filter geen één-op-één rijtoewijzing is.

In jouw geval:

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 = ' '

ofwel acccount of product zijn niet uniek in b of c .

Voor deze rijen:

a.account

1
2
3

b.account  b.description

1          Account 1
2          Account 2 - old
2          Account 2 - new

, de JOIN geeft het volgende terug:

a.account b.account b.description

1         1          Account 1
2         2          Account 2 - old
2         2          Account 2 - new
3         NULL       NULL

, waardoor u meer rijen krijgt dan een van de tabellen bevat.

Gebruik dit om de eerste overeenkomende beschrijving uit beide tabellen te kiezen:

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 = ' '

Om bij te werken, plaatst u de zoekopdracht in een inline-weergave:

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


  1. Psycopg2, Postgresql, Python:snelste manier om bulksgewijs in te voegen

  2. Hoe SQLite-database implementeren om Bitmap-afbeelding en tekst op te slaan?

  3. PDO::PARAM voor type decimaal?

  4. Databases klonen met PSDatabaseClone