AFAIK, (+)
notasi hanya hadir untuk kompatibilitas mundur karena Oracle memulai debutnya sebelum standar ANSI untuk bergabung diberlakukan. Ini khusus untuk Oracle dan Anda harus menghindari menggunakannya dalam kode baru jika tersedia versi yang memenuhi standar yang setara.
Sepertinya ada perbedaan antara keduanya, dan (+)
notasi memiliki batasan yang tidak dimiliki sintaks ANSI join. Oracle sendiri menyarankan Anda untuk tidak menggunakan (+)
notation.Deskripsi lengkap di sini di Oracle® Database SQL Language Reference11g Rilis 1 (11.1):
Oracle menyarankan Anda menggunakan
FROM
klausaOUTER JOIN
sintaks daripada operator bergabung Oracle. Kueri gabungan luar yang menggunakan operator bergabung Oracle(+)
tunduk pada aturan dan batasan berikut, yang tidak berlaku untukFROM
klausaOUTER JOIN
sintaks:
- Anda tidak dapat menentukan
(+)
operator di blok kueri yang juga berisiFROM
klausa bergabung dengan sintaks.(+)
operator hanya dapat muncul diWHERE
klausa atau, dalam konteks korelasi kiri (saat menentukanTABLE
klausa) diFROM
klausa, dan hanya dapat diterapkan ke kolom tabel atau tampilan.- Jika A dan B digabungkan dengan beberapa kondisi join, maka Anda harus menggunakan
(+)
operator dalam semua kondisi ini. Jika tidak, maka Oracle Database hanya akan mengembalikan baris yang dihasilkan dari gabungan sederhana, tetapi tanpa peringatan atau kesalahan untuk memberi tahu Anda bahwa Anda tidak memiliki hasil gabungan luar.(+)
operator tidak menghasilkan gabungan luar jika Anda menentukan satu tabel di kueri luar dan tabel lainnya di kueri dalam.- Anda tidak dapat menggunakan
(+)
operator untuk melakukan outer-join ke tabel itu sendiri, meskipun self join adalah valid.Misalnya, pernyataan berikut tidak valid:
SELECT employee_id, manager_id FROM employees WHERE employees.manager_id(+) = employees.employee_id;
Namun, self join berikut ini valid:
SELECT e1.employee_id, e1.manager_id, e2.employee_id FROM employees e1, employees e2 WHERE e1.manager_id(+) = e2.employee_id;
(+)
operator hanya dapat diterapkan ke kolom, bukan ekspresi arbitrer. Namun, ekspresi arbitrer dapat berisi satu atau lebih kolom yang ditandai dengan(+)
operator.- Sebuah
WHERE
kondisi yang mengandung(+)
operator tidak dapat digabungkan dengan kondisi lain menggunakanOR
operator logika.- Sebuah
WHERE
kondisi tidak dapat menggunakanIN
kondisi perbandingan untuk membandingkan kolom yang ditandai dengan(+)
operator dengan ekspresi.Jika
WHERE
klausa berisi kondisi yang membandingkan kolom dari tabel B dengan konstanta, maka(+)
operator harus diterapkan ke kolom sehingga Oracle mengembalikan baris dari tabel A yang telah menghasilkan null untuk kolom ini. Jika tidak, Oracle hanya mengembalikan hasil gabungan sederhana.Dalam kueri yang melakukan gabungan luar lebih dari dua pasang tabel, satu tabel bisa menjadi tabel yang dihasilkan nol hanya untuk satu tabel lainnya. Karena alasan ini, Anda tidak dapat menerapkan
(+)
operator ke kolom B dalam kondisi join untuk A dan B dan kondisi join untuk B dan C. LihatSELECT
untuk sintaks untuk gabungan luar.