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

Få ekstra rækker - Efter sammenføjning af de 3 borde ved hjælp af Left Join

Når du JOIN to eller flere tabeller sammen, får du effektivt et kartesisk produkt til disse tabeller, hvortil et filter er angivet i JOIN betingelse er anvendt.

Dette er mere indlysende, når du bruger en forældet implicit JOIN syntaks.

LEFT JOIN garanterer, at du ikke får mindre rækker end tabellen længst til venstre indeholder, dvs. e. hver række fra tabellen længst til venstre returneres mindst én gang.

Du kan stadig få flere rækker, hvis filteret ikke er en en-til-en række-mapping.

I dit tilfælde:

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

enten acccount eller product er ikke unikke i b eller c .

For disse rækker:

a.account

1
2
3

b.account  b.description

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

, JOIN returnerer følgende:

a.account b.account b.description

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

, hvilket giver dig flere rækker, end nogen af ​​tabellerne indeholder.

For blot at vælge den første matchende beskrivelse fra en af ​​tabellerne, brug denne:

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

For at opdatere skal du blot omslutte forespørgslen i en indlejret visning:

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. Sådan viser du fejl i sqlplus

  2. Hvad gør ::i PostgreSQL?

  3. fejl, streng eller binære data vil blive afkortet, når du forsøger at indsætte

  4. Vælg en kolonne, hvis den anden kolonne er nul