sql >> Databasteknik >  >> RDS >> Oracle

Få extra rader - Efter att ha sammanfogat de 3 borden med Left Join

När du JOIN två eller flera tabeller tillsammans, får du i praktiken en kartesisk produkt för dessa tabeller till vilken ett filter anges i JOIN villkor tillämpas.

Detta är mer uppenbart när du använder en föråldrad implicit JOIN syntax.

LEFT JOIN garanterar att du inte får mindre rader än tabellen längst till vänster innehåller, dvs. e. varje rad från tabellen längst till vänster returneras minst en gång.

Du kan fortfarande få fler rader om filtret inte är en en-till-en-radmappning.

I ditt fall:

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

antingen acccount eller product är inte unika i b eller c .

För dessa rader:

a.account

1
2
3

b.account  b.description

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

, JOIN returnerar följande:

a.account b.account b.description

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

, vilket ger dig fler rader än någon av tabellerna innehåller.

För att bara välja den första matchande beskrivningen från någon av tabellen, använd detta:

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

För att uppdatera, linda bara in frågan i en inline-vy:

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. Spring Data JPA + Hibernate Hoppa över låsta rader (PostgreSQL)

  2. Hur man beräknar skillnaden mellan två tidsstämplar i Oracle

  3. hur lägger man till anpassad adapter till aktiviteten för att få listan att visas i aktiviteten?

  4. 2 exempeldatabaser för SQLite