Saya memeriksa beberapa Pernyataan SQL lama untuk tujuan mendokumentasikan mereka dan mungkin memperbaikinya.
DBMS adalah Oracle
Saya tidak mengerti pernyataan yang berbunyi seperti ini:
select ...
from a,b
where a.id=b.id(+)
Saya bingung tentang (+)
operator, dan tidak bisa mendapatkannya di forum mana pun ... (mencari + di dalam tanda kutip juga tidak berfungsi).
Lagi pula, saya menggunakan 'Explain Plan' dari SQLDeveloper dan saya mendapatkan output yang mengatakan itu HASH JOIN, RIGHT OUTER
, dll.
Apakah ada perbedaan jika saya menghapus (+)
operator di akhir permintaan? Apakah database harus memenuhi beberapa persyaratan (seperti memiliki beberapa indeks, dll.) Sebelum (+)
dapat digunakan ?? Akan sangat membantu jika Anda bisa memberi saya pemahaman yang sederhana, atau beberapa tautan bagus di mana saya bisa membaca tentang ini.
Terima kasih!
sumber
Jawaban:
Itu notasi khusus Oracle untuk OUTER JOIN, karena format ANSI-89 (menggunakan koma dalam klausa FROM untuk memisahkan referensi tabel) tidak menstandarisasi join OUTER.
Permintaan akan ditulis ulang dalam sintaks ANSI-92 sebagai:
Tautan ini cukup bagus untuk menjelaskan perbedaan antara BERGABUNG .
Perlu juga dicatat bahwa meskipun
(+)
bekerja, Oracle merekomendasikan untuk tidak menggunakannya :sumber
Operator (+) menunjukkan sambungan luar. Ini berarti bahwa Oracle masih akan mengembalikan catatan dari sisi lain sambungan meskipun tidak ada kecocokan. Misalnya jika a dan b adalah emp dan dept dan Anda dapat memiliki karyawan yang belum ditugaskan ke departemen maka pernyataan berikut akan mengembalikan rincian semua karyawan apakah mereka telah ditugaskan ke departemen.
Jadi singkatnya, menghapus (+) dapat membuat perbedaan yang signifikan tetapi Anda mungkin tidak melihat untuk sementara waktu tergantung pada data Anda!
sumber
Di Oracle, (+) menunjukkan tabel "opsional" di GABUNG. Jadi dalam kueri Anda,
itu adalah LEFT OUTER BERGABUNG dari tabel 'b' to table 'a'. Ini akan mengembalikan semua data dari tabel 'a' tanpa kehilangan data ketika pihak lain (tabel opsional 'b') tidak memiliki data.
Sintaks standar modern untuk kueri yang sama adalah
atau dengan singkatan untuk
a.id=b.id
(tidak didukung oleh semua database):Jika Anda menghapus (+) maka itu akan menjadi permintaan bergabung dalam normal
Sintaks yang lebih lama, di Oracle dan basis data lainnya:
Sintaks yang lebih modern:
Atau sederhananya:
Ini hanya akan mengembalikan semua data di mana nilai 'a' & 'b' tables 'id' sama, berarti bagian umum.
Jika Anda ingin membuat kueri Anda, Bergabunglah dengan Benar
Ini sama dengan LEFT JOIN, tetapi mengganti tabel mana yang opsional.
Sintaks Oracle lama:
Sintaks standar modern:
Ref & help:
https://asktom.oracle.com/pls/asktom/f?p=100:11::::::P11_QUESTION_ID:6585774577187
Kiri Luar Gabung menggunakan + masuk Oracle 11g
https://www.w3schools.com/sql/sql_join_left.asp
sumber
Dalam praktiknya, simbol + ditempatkan langsung dalam pernyataan bersyarat dan di sisi tabel opsional (yang diizinkan mengandung nilai kosong atau nol di dalam bersyarat).
sumber