ผู้ประกอบการ“ (+)” ของออราเคิล


155

ฉันกำลังตรวจสอบคำสั่ง SQL เก่าบางส่วนเพื่อจุดประสงค์ในการจัดทำเอกสารและอาจปรับปรุงให้ดีขึ้น

DBMS คือ Oracle

ฉันไม่เข้าใจข้อความที่อ่านเช่นนี้

select ...
from a,b
where a.id=b.id(+)

ฉันสับสนเกี่ยวกับ(+)โอเปอเรเตอร์และไม่สามารถรับได้ที่ฟอรัมใด ๆ ... (การค้นหา + ภายในเครื่องหมายคำพูดไม่ทำงานเช่นกัน)

อย่างไรก็ตามฉันใช้ 'อธิบายแผน' ของ SQLDeveloper และฉันได้ผลลัพธ์ที่บอกว่าHASH JOIN, RIGHT OUTERเป็นต้น

จะมีความแตกต่างหรือไม่หากฉันลบ(+)โอเปอเรเตอร์เมื่อสิ้นสุดการสืบค้น ฐานข้อมูลต้องเป็นไปตามเงื่อนไข (เช่นมีดัชนีบางอย่างหรือไม่) ก่อนที่จะ(+)สามารถใช้งานได้หรือไม่? มันจะมีประโยชน์อย่างมากหากคุณสามารถให้ความเข้าใจได้ง่ายหรือลิงก์ที่ดีที่ฉันสามารถอ่านเกี่ยวกับเรื่องนี้

ขอบคุณ!


1
มันไม่ใช่โอเปอเรเตอร์ มันเป็นเพียงส่วนหนึ่งของไวยากรณ์ที่มีผลต่อการทำงานของ JOIN
philipxy

คำตอบ:


186

นั่นเป็นเครื่องหมายเฉพาะของ Oracle สำหรับ OUTER JOIN เนื่องจากรูปแบบ ANSI-89 (ใช้เครื่องหมายจุลภาคในส่วนคำสั่ง FROM เพื่อแยกตารางอ้างอิง) ไม่ได้รวม OUTER มาตรฐาน

แบบสอบถามจะเขียนใหม่ในไวยากรณ์ ANSI-92 ดังนี้:

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

การเชื่อมโยงนี้สวยดีที่อธิบายความแตกต่างระหว่างร่วม


ควรสังเกตว่าถึงแม้จะเป็น(+)งานที่Oracle แนะนำไม่ใช้ :

Oracle แนะนำให้คุณใช้ไวยากรณ์FROMส่วนคำสั่งOUTER JOINแทนที่จะเป็นผู้ให้บริการ Oracle join แบบสอบถามแบบใช้ร่วมภายนอกที่ใช้ตัวดำเนินการเข้าร่วมของ Oracle (+)อยู่ภายใต้กฎและข้อ จำกัด ต่อไปนี้ซึ่งไม่ได้ใช้กับไวยากรณ์FROMส่วนคำสั่งOUTER JOIN:


79
ถูกต้อง เพื่อให้ (+) ตรงไปที่หัวของฉัน (ด้านซ้ายกับด้านขวา) ฉันชอบคิดว่า (+) เป็น "การเพิ่มค่า NULL หากไม่พบที่ตรงกัน" ตัวอย่างเช่น "a.id = b.id (+)" หมายถึงอนุญาตให้ b.id เป็น NULL หากไม่มีการจับคู่กับ a.id
ชายหาด

ขอบคุณ .. ฉันเดาว่าการเพิ่มลงในข้อควรให้ผลลัพธ์เดียวกัน !!
Kiran S

คุณอาจต้องการลิงค์ในเอกสารทางการของ Oracle: docs.oracle.com/html/A95915_01/sqopr.htm
Vargan

27

ตัวดำเนินการ (+) หมายถึงการรวมภายนอก ซึ่งหมายความว่า Oracle จะยังคงส่งคืนระเบียนจากด้านอื่น ๆ ของการเข้าร่วมแม้ว่าจะไม่มีการจับคู่ ตัวอย่างเช่นถ้า a และ b เป็น emp และ dept และคุณสามารถให้พนักงานที่ไม่ได้มอบหมายให้แผนกได้ข้อความต่อไปนี้จะส่งคืนรายละเอียดของพนักงานทุกคนไม่ว่าพวกเขาจะได้รับมอบหมายให้แผนกหรือไม่

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

ดังนั้นในระยะสั้นการลบ (+) อาจสร้างความแตกต่างอย่างมีนัยสำคัญ แต่คุณอาจไม่สังเกตเห็นสักครู่ขึ้นอยู่กับข้อมูลของคุณ!


25

ใน Oracle (+) หมายถึงตาราง "ทางเลือก" ใน JOIN ดังนั้นในการค้นหาของคุณ

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

มันเป็นซ้ายเข้าร่วมของตาราง 'b' เพื่อตาราง 'a' มันจะส่งคืนข้อมูลทั้งหมดของตาราง 'a' โดยไม่สูญเสียข้อมูลเมื่อด้านอื่น (ตารางตัวเลือก 'b') ไม่มีข้อมูล

แผนผังของ Left Outer Join

ไวยากรณ์มาตรฐานที่ทันสมัยสำหรับการค้นหาเดียวกันจะเป็น

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

หรือมีชวเลขสำหรับa.id=b.id(ไม่สนับสนุนโดยฐานข้อมูลทั้งหมด):

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

หากคุณลบ (+) จะเป็นการสืบค้นเข้าร่วมภายในปกติ

ไวยากรณ์เก่ากว่าทั้งใน Oracle และฐานข้อมูลอื่น:

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

ไวยากรณ์ที่ทันสมัยมากขึ้น:

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

หรือเพียงแค่:

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

ไดอะแกรมของ Inner Inner

มันจะส่งคืนข้อมูลทั้งหมดที่ค่า 'a' & 'b' tables 'id' เหมือนกันเท่านั้นหมายถึงส่วนทั่วไป

ถ้าคุณต้องการที่จะทำให้แบบสอบถามของคุณเข้าร่วมที่เหมาะสม

นี่เป็นเหมือนกับ LEFT JOIN แต่สลับว่าตารางใดเป็นตัวเลือก

ไดอะแกรมของ Right Outer Join

ไวยากรณ์ Oracle เก่า:

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

ไวยากรณ์มาตรฐานที่ทันสมัย:

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

การอ้างอิง & ช่วยเหลือ:

https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187

Left Outer Join โดยใช้เครื่องหมาย + ใน Oracle 11g

https://www.w3schools.com/sql/sql_join_left.asp


ป้ายกำกับวงกลม "table1" & "table2" นั้นไร้สาระ ความหมายที่ง่ายที่สุดสำหรับองค์ประกอบวงกลมคือแถวผลลัพธ์ จากนั้นเสี้ยวด้านซ้ายจะมีแถวที่ขยายเป็นโมฆะของตารางที่ 1 และเสี้ยวที่ถูกต้องจะมีแถวที่ขยายเป็นโมฆะของตารางที่ 2 ความหมายอื่นสำหรับวงกลมนั้นไม่ชัดเจน คุณคิดว่าไดอะแกรมหมายความว่าอย่างไร เหตุใดคุณจึงใส่พวกเขาไว้นอกเหนือจากการคัดลอกการนำเสนอของคนอื่น (ไม่ดี) อย่างสุ่ม ๆ
philipxy

ขณะนี้คุณได้ระบุแวดวง a & b แวดวงไม่ใช่แถวของ & b วงกลมด้านซ้ายและขวาอาจมีป้ายกำกับแถวของการรวมด้านซ้ายอย่างสมเหตุสมผลและการเข้าร่วมทางขวา b ยิ่งกว่านั้นคุณไม่ได้อธิบายว่าแถวที่ล้อมรอบนั้นอยู่ในรูปของอินพุต ออกกำลังกายเพื่อสิ่งที่อยู่ในแวดวง หากคุณต้องการติดป้ายกำกับ & & บนวงกลมให้อธิบายอย่างชัดเจนด้วยคำว่าแต่ละป้ายมีส่วนเกี่ยวข้องกับวงกลม (ไม่มีเหตุผลที่ตรงไปตรงมาในการติดป้าย & & b) พวกเขาเป็นเรื่องดีที่คุณติดป้ายโซนสีเขียวอย่างถูกต้อง
philipxy

6

ในทางปฏิบัติสัญลักษณ์ + จะถูกวางโดยตรงในคำสั่งแบบมีเงื่อนไขและที่ด้านข้างของตารางตัวเลือก (สิ่งที่ได้รับอนุญาตให้มีค่าว่างหรือค่าว่างภายในเงื่อนไข)


วาง (+) ทางด้านขวาของชื่อคอลัมน์ทันที คำตอบนี้ไม่ชัดเจนเกี่ยวกับที่ "ในทางปฏิบัติ" ควรจะหมายถึงอะไร? (วาทศิลป์) (และคุณอาจไม่ได้หมายถึง "คำสั่ง")
philipxy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.