Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Uzyskiwanie dodatkowych rzędów - Po dołączeniu do 3 stołów za pomocą Left Join

Kiedy JOIN dwie lub więcej tabel razem, w efekcie otrzymujesz produkt kartezjański dla tych tabel, do których filtr określony w JOIN warunek jest stosowany.

Jest to bardziej oczywiste, gdy używasz przestarzałego niejawnego JOIN składnia.

LEFT JOIN gwarantuje, że nie otrzymasz mniej wierszy, które zawiera skrajna lewa tabela, tj. mi. każdy wiersz z tabeli znajdującej się po lewej stronie jest zwracany co najmniej raz.

Nadal możesz uzyskać więcej wierszy, jeśli filtr nie jest mapowaniem jeden do jednego.

W Twoim przypadku:

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

albo acccount lub product nie są unikalne w b lub c .

Dla tych wierszy:

a.account

1
2
3

b.account  b.description

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

, JOIN zwróci następujące informacje:

a.account b.account b.description

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

, co daje więcej wierszy niż zawiera którakolwiek z tabel.

Aby wybrać pierwszy pasujący opis z dowolnej tabeli, użyj tego:

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

Aby zaktualizować, po prostu zapakuj zapytanie do widoku wbudowanego:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Brama PL/SQL w R11i

  2. Nadmiarowość N+1 i konsolidacja serwerów

  3. 2 sposoby zwracania wierszy, które nie zawierają wartości liczbowych w Oracle

  4. Darmowy ES dla 11.2.0.4 i 12.2 Data wydania

  5. Dynamiczna partycja tabeli Oracle