sql >> Databáze >  >> RDS >> Oracle

Získání dalších řádků - Po připojení ke 3 stolům pomocí levého spojení

Když se JOIN dvě nebo více tabulek dohromady, efektivně získáte kartézský součin pro tyto tabulky, ke kterému je filtr uvedený v JOIN je použita podmínka.

To je jasnější, když použijete zastaralý implicitní JOIN syntaxe.

LEFT JOIN zaručuje, že nedostanete nic méně řádků, než obsahuje tabulka zcela vlevo, tj. E. každý řádek z tabulky zcela vlevo je vrácen alespoň jednou.

Stále můžete získat více řádků, pokud filtr není mapování řádků jeden na jeden.

Ve vašem případě:

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

buď acccount nebo product nejsou jedinečné v b nebo c .

Pro tyto řádky:

a.account

1
2
3

b.account  b.description

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

, JOIN vrátí následující:

a.account b.account b.description

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

, čímž získáte více řádků, než obsahuje kterákoli z tabulek.

Chcete-li pouze vybrat první odpovídající popis z kterékoli tabulky, použijte toto:

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

Chcete-li aktualizovat, stačí zabalit dotaz do vloženého zobrazení:

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. Funkce JSON jsou nyní v SQLite ve výchozím nastavení povoleny

  2. Volání uložené procedury Oracle s výstupním parametrem ze serveru SQL

  3. Tři hlavní trendy ovlivňující DBA odpovědné za monitorování SQL Serveru

  4. 19.3 PDB Zavřít ORA-65107 ORA-16078