Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Mendapatkan baris tambahan - Setelah bergabung dengan 3 tabel menggunakan Gabung Kiri

Saat Anda JOIN dua atau lebih tabel bersama-sama, Anda secara efektif mendapatkan produk kartesius untuk tabel ini yang filternya dinyatakan dalam JOIN kondisi diterapkan.

Ini lebih jelas ketika Anda menggunakan JOIN implisit yang sudah usang sintaks.

LEFT JOIN menjamin bahwa Anda tidak akan mendapatkan kurang baris dari tabel paling kiri berisi, i. e. setiap baris dari tabel paling kiri dikembalikan setidaknya satu kali.

Anda masih bisa mendapatkan lebih banyak baris, jika filternya bukan pemetaan baris satu-ke-satu.

Dalam kasus Anda:

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

baik acccount atau product tidak unik dalam b atau c .

Untuk baris ini:

a.account

1
2
3

b.account  b.description

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

, JOIN akan mengembalikan berikut ini:

a.account b.account b.description

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

, memberi Anda lebih banyak baris daripada isi tabel mana pun.

Untuk memilih deskripsi pertama yang cocok dari salah satu tabel, gunakan ini:

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

Untuk memperbarui, cukup bungkus kueri menjadi tampilan sebaris:

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. Prosedur Oracle tidak mengembalikan hasil saat menjalankan dari tugas skrip di SSIS

  2. Bagaimana ROWNUM bekerja dalam kueri pagination?

  3. Daftar Semua Fungsi di Oracle Database

  4. Cara Membuat Prosedur Di Dalam Paket di Oracle

  5. Ambil IDENTITAS yang terakhir dimasukkan Oracle