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

Gabung Kiri dan Kanan Menggunakan Tanda Plus (+) di Oracle

  • Apa itu Inner Join?
  • Apa itu Outer Join?
    • Melakukan Penggabungan Luar Menggunakan Simbol (+)

Seperti hampir semua database relasional, Oracle memungkinkan kueri dihasilkan yang menggabungkan atau JOIN baris dari dua atau lebih tabel untuk membuat set hasil akhir. Meskipun ada banyak jenis gabungan yang dapat dilakukan, yang paling umum adalah INNER JOIN dan OUTER JOINS .

Dalam tutorial ini, kita akan secara singkat mengeksplorasi perbedaan antara INNER dan OUTER JOINS dan kemudian periksa metode singkatan yang disediakan Oracle untuk melakukan OUTER JOINS khusus menggunakan + simbol operator.

Apa itu Inner Join?

Sebuah INNER JOIN dalam database relasional hanyalah penggabungan dua atau lebih tabel di mana hasilnya hanya berisi data yang memenuhi semua kondisi gabungan .

Misalnya, di sini kita memiliki library basic dasar skema dengan dua tabel:books dan languages . languages tabel hanyalah daftar nama bahasa yang mungkin dan bahasa yang unik id :

SELECT * FROM library.languages;

id   name
1   English
2   French
3   German
4   Mandarin
5   Spanish
6   Arabic
7   Japanese
8   Russian
9   Greek
10   Italian

Sementara itu, books tabel memiliki language_id baris yang untuk sebagian besar, tetapi tidak semua, buku hanya berisi language_id terkait dengan bahasa asli buku yang diterbitkan:

SELECT * FROM
  books
ORDER BY
  id
FETCH FIRST 10 ROWS ONLY;

id title    author    year_published    language_id
1   In Search of Lost Time  Marcel Proust   1913    2
2   Ulysses James Joyce 1922    1
3   Don Quixote Miguel de Cervantes 1605    5
4   Moby Dick   Herman Melville 1851    1
5   Hamlet  William Shakespeare 1601 (null)
6   War and Peace   Leo Tolstoy 1869    8
7   The Odyssey Homer   -700    9
8   The Great Gatsby    F. Scott Fitzgerald 1925    1
9   The Divine Comedy   Dante Alighieri     1472    10
10  Madame Bovary   Gustave Flaubert    1857    2

Dalam banyak kasus, kami mungkin ingin melakukan INNER JOIN dari books dan languages tabel jadi daripada melihat language_id yang tidak berarti nilai setiap buku, kita benar-benar dapat melihat language name sebagai gantinya.

SELECT
  b.id,
  b.title,
  b.author,
  b.year_published,
  l.name language
FROM
  books b
INNER JOIN
  library.languages l
ON
  b.language_id = l.id
ORDER BY
  b.id
FETCH FIRST 10 ROWS ONLY;

id title    author    year_published    language
1   In Search of Lost Time  Marcel Proust   1913    French
2   Ulysses James Joyce 1922    English
3   Don Quixote Miguel de Cervantes 1605    Spanish
4   Moby Dick   Herman Melville 1851    English
6   War and Peace   Leo Tolstoy 1869    Russian
7   The Odyssey Homer   -700    Greek
8   The Great Gatsby    F. Scott Fitzgerald 1925    English
9   The Divine Comedy   Dante Alighieri     1472    Italian
10  Madame Bovary   Gustave Flaubert    1857    French
11  The Brothers Karamazov  Fyodor Dostoyevsky  1880    Russian

Yang penting untuk diperhatikan di sini adalah bahwa kumpulan hasil kami sedikit berbeda dalam dua kueri di atas. Pada bagian pertama, kami hanya mencantumkan 10 pertama buku, tetapi dalam INNER JOIN kueri kami hanya mengembalikan hasil yang memenuhi semua ketentuan dari kedua tabel. Untuk alasan ini, catatan Hamlet (yang memiliki language_id nilai null atau kosong) diabaikan dan tidak dikembalikan dalam hasil INNER JOIN .

Apa itu Outer Join?

Alih-alih secara eksklusif mengembalikan hasil yang memenuhi semua kondisi gabungan dari INNER JOIN , sebuah OUTER JOINS mengembalikan tidak hanya hasil yang memenuhi semua kondisi, tetapi juga mengembalikan baris dari satu tabel yang tidak memenuhi kondisi. Tabel yang dipilih untuk "memotong" persyaratan bersyarat ini ditentukan oleh arah atau "sisi" gabungan, biasanya disebut sebagai LEFT atau RIGHT gabungan luar.

Saat menentukan sisi ke OUTER JOINS Anda , Anda menentukan tabel mana yang akan selalu mengembalikan barisnya meskipun berlawanan tabel di sisi lain gabungan tidak ada atau null nilai sebagai bagian dari kondisi bergabung.

Oleh karena itu, jika kita melakukan JOIN dasar yang sama seperti di atas untuk mengambil books dan language name , kami tahu bahwa books our kami tabel harus selalu mengembalikan data, jadi JOIN our sisi harus "menunjuk ke arah" books kami tabel, sehingga membuat languages tabel OUTER tabel yang kami lampirkan.

Untuk mencapai ini, kita cukup mengubah:

books b INNER JOIN library.languages l

…untuk ini:

books b LEFT OUTER JOIN library.languages l

Dengan demikian, seluruh kueri dan kumpulan hasil terlihat hampir identik dengan INNER JOIN kecuali perubahan kecil itu:

SELECT
  b.id,
  b.title,
  b.author,
  b.year_published,
  l.name language
FROM
  books b
LEFT OUTER JOIN
  library.languages l
ON
  b.language_id = l.id
ORDER BY
  b.id
FETCH FIRST 10 ROWS ONLY;

id title    author    year_published    language
1   In Search of Lost Time  Marcel Proust   1913    French
2   Ulysses James Joyce 1922    English
3   Don Quixote Miguel de Cervantes 1605    Spanish
4   Moby Dick   Herman Melville 1851    English
5   Hamlet  William Shakespeare 1601  (null)
6   War and Peace   Leo Tolstoy 1869    Russian
7   The Odyssey Homer   -700    Greek
8   The Great Gatsby    F. Scott Fitzgerald 1925    English
9   The Divine Comedy   Dante Alighieri     1472    Italian
10  Madame Bovary   Gustave Flaubert    1857    French

Seperti yang diharapkan, dengan menggunakan LEFT OUTER JOIN bukannya INNER JOIN sebelumnya , kami mendapatkan yang terbaik dari kedua dunia:Kami tidak melewatkan books apa pun catatan (seperti Hamlet ) hanya karena language_id nilainya null untuk catatan itu, namun untuk semua catatan di mana language_id ada, kami mendapatkan language name yang diformat dengan baik diperoleh dari languages . kami tabel.

Melakukan Gabungan Luar Menggunakan Simbol (+)

Seperti yang ditunjukkan dalam dokumentasi resmi, Oracle menyediakan outer join operator khusus (+ simbol) yang merupakan singkatan untuk melakukan OUTER JOINS .

Dalam praktiknya, + simbol ditempatkan langsung dalam kondisi pernyataan dan di sisi tabel opsional (yang diperbolehkan berisi kosong atau null nilai dalam kondisi).

Oleh karena itu, sekali lagi kita dapat menulis ulang LEFT OUTER JOIN kita di atas pernyataan menggunakan + operator seperti ini:

SELECT
  b.id,
  b.title,
  b.author,
  b.year_published,
  l.name language
FROM
  books b,
  library.languages l
WHERE
  l.id (+)= b.language_id
ORDER BY
  b.id
FETCH FIRST 10 ROWS ONLY;

Hasilnya sama dengan standar LEFT OUTER JOIN contoh di atas, jadi kami tidak akan menyertakannya di sini. Namun, ada satu aspek penting yang perlu diperhatikan tentang sintaks menggunakan + operator untuk OUTER JOINS .

+ operator harus berada di sisi kiri kondisional (kiri sama dengan = tanda). Oleh karena itu, dalam hal ini, karena kami ingin memastikan bahwa languages . kami table adalah tabel opsional yang dapat mengembalikan null nilai selama perbandingan ini, kami menukar urutan tabel dalam kondisi ini, jadi languages ada di sebelah kiri (dan opsional) sementara books ada di sebelah kanan.

Terakhir, karena penataan ulang sisi tabel dalam kondisi saat menggunakan + operator, penting untuk menyadari bahwa di atas hanyalah singkatan untuk RIGHT OUTER JOIN . Ini berarti potongan kueri ini:

FROM
  books b,
  library.languages l
WHERE
  l.id (+)= b.language_id

…secara efektif identik dengan ini:

FROM
  library.languages l
RIGHT OUTER JOIN
  books b
ON
  b.language_id = l.id

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dari Stored Procedure, kembalikan parameter OUT &kursor OUT &hasil parse (Oracle)

  2. Apakah ada cara untuk memberikan pesan kesalahan yang mudah digunakan pada pelanggaran batasan?

  3. SQLT dan Partisi

  4. Prosedur Tersimpan Musim Semi - hasil yang kembali dari prosedur selalu kosong

  5. Cara Mengubah Format Tanggal di Sesi Oracle Anda