Oracle
 sql >> база данни >  >> RDS >> Oracle

Получаване на допълнителни редове - След присъединяване към 3-те маси с помощта на Left Join

Когато JOIN две или повече таблици заедно, вие ефективно получавате декартов продукт за тези таблици, към който филтърът е посочен в JOIN се прилага условието.

Това е по-очевидно, когато използвате остаряло имплицитно JOIN синтаксис.

LEFT JOIN гарантира, че не получавате по-малко редове, отколкото съдържа най-лявата таблица, т.е. д. всеки ред от най-лявата таблица се връща поне веднъж.

Все още можете да получите повече редове, ако филтърът не е едно към едно съпоставяне на редове.

Във вашия случай:

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

или acccount или product не са уникални в b или c .

За тези редове:

a.account

1
2
3

b.account  b.description

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

, JOIN ще върне следното:

a.account b.account b.description

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

, което ви дава повече редове, отколкото всяка от таблиците съдържа.

За да изберете само първото съответстващо описание от която и да е таблица, използвайте това:

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

За да актуализирате, просто увийте заявката във вграден изглед:

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. Има ли най-добрият начин да избегнете изпълнението на процес повече от веднъж в Oracle?

  2. Как да получите името на деня от седмицата от дата?

  3. Инсталиране на Oracle 32-bit Client на Windows Server, който вече работи с 64-битов Oracle Database Server

  4. Определете дали датата на Oracle е в уикенд?

  5. Как да декларирате потребителско дефинирано изключение с помощта на променлива за изключение в базата данни на Oracle