Operator Oracle "(+)"


155

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!


1
Itu bukan operator. Itu hanya sepotong sintaks yang mempengaruhi apa yang BERGABUNG lakukan.
philipxy

Jawaban:


187

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:

   SELECT ...
     FROM a
LEFT JOIN b ON b.id = a.id

Tautan ini cukup bagus untuk menjelaskan perbedaan antara BERGABUNG .


Perlu juga dicatat bahwa meskipun (+)bekerja, Oracle merekomendasikan untuk tidak menggunakannya :

Oracle merekomendasikan Anda untuk menggunakan sintaksis FROMklausa OUTER JOINdaripada Oracle bergabung dengan operator. Kueri gabung luar yang menggunakan operator gabung Oracle (+)tunduk pada aturan dan batasan berikut, yang tidak berlaku untuk sintaksis FROMklausa OUTER JOIN:


79
Benar sekali. Untuk menjaga (+) tetap di kepala saya (sisi kiri vs sisi kanan), saya suka menganggap (+) sebagai "menambahkan nilai NULL jika tidak ditemukan kecocokan". Misalnya, "a.id = b.id (+)" berarti memungkinkan b.id menjadi NULL jika tidak ada kecocokan dengan a.id.
pantai

terima kasih..Saya kira menambahkannya dari klausa harus menghasilkan hasil yang sama !!
Kiran S

Anda mungkin ingin memiliki tautan di dokumentasi resmi Oracle: docs.oracle.com/html/A95915_01/sqopr.htm
Vargan

27

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.

select * from emp, dept where emp.dept_id=dept.dept_id(+)

Jadi singkatnya, menghapus (+) dapat membuat perbedaan yang signifikan tetapi Anda mungkin tidak melihat untuk sementara waktu tergantung pada data Anda!


25

Di Oracle, (+) menunjukkan tabel "opsional" di GABUNG. Jadi dalam kueri Anda,

SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id(+)

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.

Diagram Gabung Luar Kiri

Sintaks standar modern untuk kueri yang sama adalah

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b ON a.id=b.id

atau dengan singkatan untuk a.id=b.id(tidak didukung oleh semua database):

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b USING(id)

Jika Anda menghapus (+) maka itu akan menjadi permintaan bergabung dalam normal

Sintaks yang lebih lama, di Oracle dan basis data lainnya:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id

Sintaks yang lebih modern:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
INNER JOIN b ON a.id=b.id

Atau sederhananya:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
JOIN b ON a.id=b.id

Diagram Gabung Dalam

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.

Diagram Gabung Luar Kanan

Sintaks Oracle lama:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id(+)=b.id

Sintaks standar modern:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
RIGHT JOIN b ON a.id=b.id

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


Label lingkaran "table1" & "table2" tidak masuk akal. Arti paling sederhana untuk elemen lingkaran adalah baris output. Kemudian bulan sabit kiri berisi baris null-extended dari table1 & bulan sabit kanan berisi baris null-extended dari table2. Arti lain untuk lingkaran tidak jelas. Menurut Anda apa sebenarnya diagram itu? Mengapa Anda memasukkannya ke dalam selain menyalin presentasi (buruk) orang lain secara membabi buta?
philipxy

Anda sekarang telah memberi label lingkaran & a. Lingkaran bukan baris a & b. Lingkaran kiri & kanan cukup dapat diberi label baris dari gabungan kiri b & gabungan kanan b. Selain itu, Anda tidak menjelaskan apa baris yang dilingkari itu dalam hal input. Cari tahu sendiri hal-hal apa saja yang ada di lingkaran. Jika Anda akan menempelkan label a & b pada lingkaran, jelaskan dengan kata-kata apa yang harus dilakukan setiap label dengan lingkarannya. (Tidak ada alasan langsung untuk memberi label a & b.) Ada baiknya Anda memberi label zona hijau dengan benar.
philipxy

6

Dalam praktiknya, simbol + ditempatkan langsung dalam pernyataan bersyarat dan di sisi tabel opsional (yang diizinkan mengandung nilai kosong atau nol di dalam bersyarat).


(+) Langsung diletakkan di sebelah kanan nama kolom. Jawaban ini tidak jelas tentang itu. Apa yang dimaksud dengan "dalam praktik" artinya? (Retorika.) (Dan Anda mungkin tidak bermaksud "pernyataan".)
philipxy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.