CROSS JOIN เทียบกับ INNER JOIN ใน SQL


150

ความแตกต่างระหว่างCROSS JOINและINNER JOINคืออะไร?

ข้ามเข้าร่วม:

SELECT 
    Movies.CustomerID, Movies.Movie, Customers.Age, 
    Customers.Gender, Customers.[Education Level], 
    Customers.[Internet Connection], Customers.[Marital Status], 
FROM   
    Customers 
CROSS JOIN 
    Movies

เข้าร่วมภายใน:

SELECT 
    Movies.CustomerID, Movies.Movie, Customers.Age, 
    Customers.Gender, Customers.[Education Level], 
    Customers.[Internet Connection], Customers.[Marital Status]
FROM   
    Customers 
INNER JOIN 
    Movies ON Customers.CustomerID = Movies.CustomerID

อันไหนดีกว่าและทำไมฉันต้องใช้อันใดอันหนึ่ง


15
CROSS JOINจะส่งผลในการรวมกันเป็นไปได้ทั้งหมดของตาราง เช่น Table1 ที่มี 100 แถวและ Table2 ที่มี 100 แถวจะส่งผลให้มี 10,000 รายการ
bummi

x CROSS JOIN yคือx INNER JOIN y ON 1=1
philipxy

คำตอบ:


119

การเข้าร่วมไขว้ไม่รวมแถวหากคุณมี 100 แถวในแต่ละตารางที่มีการจับคู่ 1 ถึง 1 คุณจะได้รับผลลัพธ์ 10.000 ผลลัพธ์ Innerjoin จะส่งคืน 100 แถวในสถานการณ์เดียวกันเท่านั้น

ตัวอย่าง 2 เหล่านี้จะส่งคืนผลลัพธ์เดียวกัน:

ข้ามเข้าร่วม

select * from table1 cross join table2 where table1.id = table2.fk_id

เข้าร่วมภายใน

select * from table1 join table2 on table1.id = table2.fk_id

ใช้วิธีการสุดท้าย


7
และฉันเชื่อว่าคุณสามารถเขียนselect * from table1 cross join table2 where table1.id = table2.fk_idเป็นselect * from table1, table2 where table1.id = table2.fk_id(แทนที่cross joinด้วย,)
modulitos

5
@ Lucas นั่นคือไวยากรณ์เก่าสำหรับการรวม แต่จะใช้งานได้ ฉันแนะนำรุ่น clausen แต่อ่านได้มากขึ้น
iliketocode

1
คุณหมายถึงอะไร 1 ต่อ 1 การแข่งขัน? คุณหมายถึงอะไร "สถานการณ์เดียวกัน"
Jwan622

1
@iliketocode "ไวยากรณ์เก่าสำหรับการรวม" ไม่ชัดเจนคุณควรพูดถึงมาตรฐานของ SQL-89 และ SQL-92 ให้ดีขึ้น
Ivanzinho

INNER JOIN ของคุณ "100" เป็นกรณีพิเศษที่คุณไม่ได้อธิบายและคุณยังไม่ได้อธิบายกรณีทั่วไป
philipxy

186

นี่คือตัวอย่างที่ดีที่สุดของ Cross Join และ Inner Join

พิจารณาตารางต่อไปนี้

ตาราง : Teacher

x------------------------x
| TchrId   | TeacherName | 
x----------|-------------x
|    T1    |    Mary     |
|    T2    |    Jim      |
x------------------------x

ตาราง : Student

x--------------------------------------x
|  StudId  |    TchrId   | StudentName | 
x----------|-------------|-------------x            
|    S1    |     T1      |    Vineeth  |
|    S2    |     T1      |    Unni     |
x--------------------------------------x

1. เข้าร่วมภายใน

Inner เข้าร่วมเลือกแถวที่ทั้งสองฝ่ายตาราง

พิจารณาว่าเราต้องหาครูที่เป็นครูประจำชั้นและนักเรียนที่เกี่ยวข้อง ในสภาพเช่นนั้นเราจำเป็นต้องใช้JOINหรือINNER JOINจะ

ป้อนคำอธิบายรูปภาพที่นี่

สอบถาม

SELECT T.TchrId,T.TeacherName,S.StudentName 
FROM #Teacher T
INNER JOIN #Student S ON T.TchrId = S.TchrId

ผลลัพธ์

x--------------------------------------x
|  TchrId  | TeacherName | StudentName | 
x----------|-------------|-------------x            
|    T1    |     Mary    |    Vineeth  |
|    T1    |     Mary    |    Unni     |
x--------------------------------------x

2. CROSS เข้าร่วม

Cross เข้าร่วมเลือกแถวทั้งหมดจากตารางแรกและแถวทั้งหมดจากตารางที่สองและแสดงเป็นผลิตภัณฑ์คาร์ทีเซียนเช่นกับความเป็นไปได้ทั้งหมด

พิจารณาว่าเราจำเป็นต้องค้นหาครูทั้งหมดในโรงเรียนและนักเรียนโดยไม่คำนึงถึงครูประจำชั้นCROSS JOIN.

ป้อนคำอธิบายรูปภาพที่นี่

สอบถาม

SELECT T.TchrId,T.TeacherName,S.StudentName 
FROM #Teacher T
CROSS JOIN #Student S 

ผลลัพธ์

x--------------------------------------x
|  TchrId  | TeacherName | StudentName | 
x----------|-------------|-------------x            
|    T2    |     Jim     |    Vineeth  |
|    T2    |     Jim     |    Unni     |
|    T1    |     Mary    |    Vineeth  |
|    T1    |     Mary    |    Unni     |
x--------------------------------------x

1
กุญแจของรูปที่ 2 ซับซ้อน: มันล้อมรอบ (องค์ประกอบที่ไม่เกี่ยวข้องกับสี) ของอาร์กิวเมนต์ของ CROSS JOIN & ตัวเลข (ค่าที่ไม่เกี่ยวข้องตามค่า) คือแถวของมัน & บรรทัด (แถวที่ไม่เกี่ยวข้องสี) เป็นแถวผลลัพธ์ สำหรับตารางถุงก็ไม่แผนภาพเวนน์: สำหรับแถวเป็นค่าก็ผิด ; สำหรับแถวเป็นองค์ประกอบที่ไม่สามารถแชร์ได้ สำหรับตารางเป็นชุดคุณไม่จำเป็นต้องมี Venn diagram รูปที่ 1 เป็นความพยายามที่แย่มากที่จะอธิบายการเข้าร่วม มันเป็นกุญแจสำคัญที่ซับซ้อน: มันเป็นเพียงสำหรับตารางเป็นชุด & เพียง equijoin & เพียงหนึ่งค่า; มันยังแสดงถึงอินพุตที่แตกต่างจากเอาท์พุท เขียนมันสำหรับการเข้าร่วมในการทั่วไป
philipxy

รูปที่ 1 มีประโยชน์และถูกต้องเป็น 4 สีแรกของวงกลม Venn diagrams สำหรับ: (INNER) JOIN กับ LEFT, RIGHT & FULL (OUTER) JOINแต่ไม่ใช่กับ CROSS JOIN แถวทางแยกอยู่ใน JOIN แถวซ้าย / ขวาเป็นแถวพิเศษ (ขยายว่าง) ในซ้าย / ขวารวม ซึ่งรวมถึง CROSS JOIN เป็นกรณีพิเศษของ (INNER) JOIN ที่ไม่มีแถวในจุดตัด
philipxy

1
ขอบคุณสำหรับคำแนะนำของคุณ อย่างไรก็ตาม OP ได้ขอความแตกต่างระหว่างทั้งสองเข้าร่วม ฉันได้ตอบคำถามนี้ในลักษณะที่ผู้เริ่มต้นสามารถเข้าใจความแตกต่างระหว่างพวกเขาได้อย่างง่ายดาย อย่างที่คุณพูดฉันไม่ได้ให้กุญแจในสภาพแวดล้อมการผลิต มันเป็นเพียงตัวอย่างที่เข้าใจได้ง่าย และสำหรับCross Joinคุณคิดว่ามันไม่ได้ส่งคืนแถวทั้งหมดเว้นแต่Whereจะได้รับข้อ? จากความคิดเห็นของคุณมีโอกาสมากขึ้นสำหรับผู้เริ่มต้นที่จะสับสน !!! @philipxy
Sarath Avanavu

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

ดู W3Schools w3schools.com/sql/sql_join_inner.aspโดยที่พวกเขาได้ให้ไดอะแกรมชนิดเดียวกันสำหรับ INNER JOIN ตรวจสอบให้แน่ใจว่าคุณถูกต้องก่อนที่จะแสดงความคิดเห็น @philipxy
Sarath Avanavu

69

CROSS JOIN = (ภายใน) JOIN = เครื่องหมายจุลภาค (",")

TL; DRความแตกต่างเพียงอย่างเดียวระหว่าง SQL CROSS JOIN, (INNER) JOIN และจุลภาค (",") (นอกเหนือจากเครื่องหมายจุลภาคที่มีลำดับความสำคัญต่ำกว่าสำหรับลำดับการประเมินผล) คือ (INNER) JOIN มี ON ในขณะ CROSS JOIN และเครื่องหมายจุลภาค


Re ผลิตภัณฑ์ระดับกลาง

ทั้งสามผลิตผลิตภัณฑ์ "คาร์ทีเซียน" แนวคิดเชิงสัมพันธ์ระดับกลางหรือที่รู้จักกันในชื่อ cross cross ซึ่งเป็นการรวมกันของแถวที่เป็นไปได้ทั้งหมดจากแต่ละตาราง มันเปิดและ / หรือตำแหน่งที่ลดจำนวนแถว ซอ Fiddle

มาตรฐาน SQL กำหนด <comma> ผ่านผลิตภัณฑ์ (7.5 1.b.ii), <cross join> ผ่าน <comma> (7.7 1.a) และเข้าร่วมกับ <เงื่อนไขการค้นหา> ผ่าน <comma> บวก WHERE (7.7 1.b )

ตามที่ Wikipedia กำหนดไว้:

ข้ามเข้าร่วม

CROSS JOIN ส่งคืนผลิตภัณฑ์คาร์ทีเซียนของแถวจากตารางในการเข้าร่วม กล่าวอีกนัยหนึ่งมันจะสร้างแถวที่รวมแต่ละแถวจากตารางแรกกับแต่ละแถวจากตารางที่สอง

เข้าร่วมภายใน

[... ] ผลลัพธ์ของการเข้าร่วมสามารถกำหนดเป็นผลลัพธ์ของการรับผลิตภัณฑ์คาร์ทีเซียนครั้งแรก (หรือการรวมข้าม) ของระเบียนทั้งหมดในตาราง (รวมทุกระเบียนในตาราง A กับทุกระเบียนในตาราง B) แล้วกลับมา เร็กคอร์ดทั้งหมดที่เข้าร่วมกับเพรดิเคต

"สัญกรณ์การเข้าร่วมโดยนัย" เพียงแสดงตารางสำหรับการเข้าร่วมในส่วนคำสั่ง FROM ของคำสั่ง SELECT โดยใช้เครื่องหมายจุลภาคเพื่อคั่นพวกเขา ดังนั้นจึงระบุการเข้าร่วมไขว้

Re OUTERร่วมและการใช้ ON VS WHERE ในพวกเขาดูเงื่อนไขใน LEFT JOIN (OUTER JOIN) VS INNER JOIN

เปรียบเทียบคอลัมน์ระหว่างตารางทำไม

เมื่อไม่มีแถวที่ซ้ำกัน:

ทุกตารางมีแถวที่สร้างคำสั่งจริงจากเทมเพลตคำสั่งแบบเติมคำเติม (มันทำให้เกิดข้อเสนอที่แท้จริงจาก - ตอบสนอง - เป็นคำกริยา (ลักษณะ) ที่แน่นอน)

  • ตารางฐานมีแถวที่สร้างคำสั่งจริงจากเทมเพลตคำสั่งที่กำหนดโดย DBA บางส่วน:

    /* rows where
    customer C.CustomerID has age C.Age and ...
    */
    FROM Customers C
    
  • ผลิตภัณฑ์ระดับกลางของการเข้าร่วมจะเก็บแถวที่สร้างข้อความจริงจากแม่แบบตัวถูกดำเนินการและของ:

    /* rows where
        customer C.CustomerID has age C.Age and ...
    AND movie M.Movie is rented by customer M.CustomerID and ...
    */
    FROM Customers C CROSS JOIN Movies M
    
  • ON & WHERE เงื่อนไขเป็น ANDED เพื่อให้แม่แบบเพิ่มเติม ค่าเป็นอีกแถวที่ตรงกับแม่แบบนั้น:

    /* rows where
        customer C.CustomerID has age C.Age and ...
    AND movie M.Movie is rented by customer M.CustomerID and ...
    AND C.CustomerID = M.CustomerID
    AND C.Age >= M.[Minimum Age]
    AND C.Age = 18
    */
    FROM Customers C INNER JOIN Movies M
    ON C.CustomerID = M.CustomerID
    AND C.Age >= M.[Minimum Age]
    WHERE C.Age = 18
    

โดยเฉพาะอย่างยิ่งการเปรียบเทียบคอลัมน์สำหรับความเท่าเทียมกัน (SQL) ระหว่างตารางหมายความว่าแถวที่เก็บจากผลิตภัณฑ์จากส่วนของตารางที่รวมของเทมเพลตมีค่าเหมือนกัน (ไม่ใช่ค่า NULL) สำหรับคอลัมน์เหล่านั้น เป็นเพียงเรื่องบังเอิญที่แถวจำนวนมากจะถูกลบออกโดยการเปรียบเทียบความเท่าเทียมกันระหว่างตาราง - สิ่งที่จำเป็นและเพียงพอคือการกำหนดลักษณะของแถวที่คุณต้องการ

เพียงเขียน SQL สำหรับเทมเพลตสำหรับแถวที่คุณต้องการ!

ความหมายของข้อความค้นหา (และตารางเทียบกับเงื่อนไข) ดู:
วิธีรับข้อมูลที่ตรงกันจากตาราง SQL อื่นสำหรับคอลัมน์ที่แตกต่างกันสองคอลัมน์: Inner Join และ / หรือ Union
มีกฎง่ายๆในการสร้างแบบสอบถาม SQL จากคำอธิบายที่มนุษย์สามารถอ่านได้?

มากไป "ข้ามเข้าร่วม"

น่าเสียดายที่คำว่า "cross join" ใช้สำหรับ:

  • ผลิตภัณฑ์ระดับกลาง
  • ข้ามเข้าร่วม
  • (ภายใน) เข้าร่วมกับ ON หรือ WHERE ที่ไม่ได้เปรียบเทียบคอลัมน์ใด ๆ จากตารางหนึ่งไปยังคอลัมน์อื่น ๆ (เนื่องจากสิ่งเหล่านี้มีแนวโน้มที่จะส่งคืนผลิตภัณฑ์แถวกลางจำนวนมาก)

ความหมายต่าง ๆ เหล่านี้ทำให้สับสน (เช่นในคำตอบและความคิดเห็นอื่น ๆ ที่นี่)

ใช้ CROSS JOIN กับ (INNER) เข้าร่วมกับเครื่องหมายจุลภาค

การประชุมสามัญคือ:

  • ใช้ CROSS JOIN เมื่อคุณไม่เปรียบเทียบคอลัมน์ระหว่างตาราง นั่นคือการแสดงให้เห็นว่าการขาดการเปรียบเทียบเป็นไปโดยเจตนา
  • ใช้ (ภายใน) เข้าร่วมกับเปิดเมื่อใดและเมื่อคุณเปรียบเทียบคอลัมน์ระหว่างตาราง (รวมถึงเงื่อนไขอื่น ๆ ที่อาจเป็นไปได้)
  • อย่าใช้เครื่องหมายจุลภาค

โดยทั่วไปแล้วเงื่อนไขที่ไม่ได้อยู่ในคู่ของตารางจะถูกเก็บไว้สำหรับ WHERE แต่พวกเขาอาจจะต้องใส่ใน (n INNER) เข้าร่วมเพื่อให้ได้แถวที่เหมาะสมสำหรับการโต้แย้งเพื่อเข้าร่วม RIGHT, LEFT หรือ FULL (OUTER)

เรื่อง "อย่าใช้เครื่องหมายจุลภาค" การผสมจุลภาคกับ JOIN อย่างชัดเจนอาจทำให้เข้าใจผิดได้เนื่องจากเครื่องหมายจุลภาคมีลำดับความสำคัญต่ำกว่า แต่ด้วยบทบาทของผลิตภัณฑ์ระดับกลางในความหมายของ CROSS JOIN, (INNER) เข้าร่วมและเครื่องหมายจุลภาคอาร์กิวเมนต์สำหรับการประชุมข้างต้นไม่ได้ใช้เลยจะสั่นคลอน CROSS JOIN หรือเครื่องหมายจุลภาคก็เหมือนกับ (เข้า) เข้าร่วมที่อยู่ในสภาพที่เป็นจริง ผลิตภัณฑ์ระดับกลาง ON และตำแหน่งที่ทุกคนแนะนำและในเพรดิเคตที่สอดคล้องกัน อย่างไรก็ตามสามารถใช้ INNER JOIN ON ในการพูดสร้างแถวเอาต์พุตเฉพาะเมื่อค้นหาคู่ของแถวอินพุตที่ตรงตามเงื่อนไข ON แต่จะส่งคืนแถวเข้าร่วมไขว้ที่ตรงตามเงื่อนไข เหตุผลเดียวที่ ON ต้องเพิ่มเครื่องหมายจุลภาคใน SQL คือเขียนOUTERร่วม แน่นอนการแสดงออกควรทำให้ความหมายชัดเจน; แต่สิ่งที่ชัดเจนขึ้นอยู่กับความหมายของสิ่งต่าง ๆ

Re Venn diagram แผนภาพ Venn ที่มีวงกลมตัดกันสองวงสามารถแสดงให้เห็นถึงความแตกต่างระหว่างแถวเอาท์พุทสำหรับ INNER, LEFT, RIGHT & FULL JOIN สำหรับอินพุตเดียวกัน และเมื่อการเปิดโดยไม่มีเงื่อนไขจริงผลการเข้าร่วมภายในจะเหมือนกับ CROSS JOIN นอกจากนี้ยังสามารถแสดงแถวอินพุตและเอาต์พุตสำหรับ INTERSECT, UNION & EXCEPT และเมื่ออินพุตทั้งสองมีคอลัมน์เดียวกันผลลัพธ์ของ INTERSECT จะเหมือนกับของ SQL NATURAL JOIN มาตรฐานและผลลัพธ์ของ EXCEPT จะเหมือนกับของสำนวนบางตัวที่เกี่ยวข้องกับ LEFT & RIGHT JOIN แต่มันไม่ได้แสดงให้เห็นว่า (INNER) JOIN ทำงานอย่างไร ที่เพียงแค่ดูเหมือนว่าเป็นไปได้อย่างรวดเร็วก่อน มันสามารถระบุชิ้นส่วนของอินพุตและ / หรือเอาท์พุทสำหรับกรณีพิเศษของ ON, PKs (คีย์หลัก), FKs (foreign foreign) และ / หรือ SELECT ทั้งหมดที่คุณต้องทำเพื่อให้เห็นว่านี่คือการระบุว่าสิ่งที่เป็นองค์ประกอบของชุดที่แสดงโดยวงการ (ซึ่งงานนำเสนอที่ยุ่งเหยิงไม่ชัดเจน) (โปรดจำไว้ว่าโดยทั่วไปสำหรับการรวมแถวเอาท์พุทจะมีส่วนหัวที่แตกต่างจากแถวอินพุตและตาราง SQL เป็นถุงที่ไม่ได้ตั้งค่าแถวด้วย NULL )


6
+1 ฉันชอบคำตอบนี้ดีที่สุด - คนอื่น ๆ ดูเหมือนว่านัยว่าผลลัพธ์จะแตกต่างกัน แต่ถ้าประโยค "ON" ถูกแทนที่ด้วย "WHERE" ผลลัพธ์จะเหมือนกัน
Ronnie

4
+1 ขอบคุณสำหรับการล้างค่าที่ไม่ใช้ส่วนคำสั่ง ON ใน INNER JOIN จะให้ผลลัพธ์เหมือนกับการใช้ CROSS JOIN
Cerno

"สื่อกลางคาร์ทีเซียนสไตล์ข้ามแนวคิด SQL -" เป็นอีกวิธีหนึ่งในการพูดว่า "มันไม่ใช่ชุดของคู่ที่สั่งไว้ แต่ฉันไม่สามารถหลีกเลี่ยงการพูดว่า" ผลิตภัณฑ์คาร์ทีเซียน "" หรือไม่ :) ในฐานะที่เป็นนักคณิตศาสตร์ที่ไม่ใช่ตัวเองบริบทเดียวที่ผมเคยพบคำว่า 'คาร์ทีเซียนของผลิตภัณฑ์คือเมื่อมีคนอธิบาย CROSS JOINSQL ฉันสงสัยว่ามีคนมาที่ SQL ที่คุ้นเคยกับผลิตภัณฑ์ Cartesian บ่อยแค่ไหน แต่ไม่สามารถคิดออกCROSS JOINได้
oneday เมื่อ

1
@onedaywhen ผลิตภัณฑ์โอเปอเรเตอร์คาร์ทีเซียนส่งคืนชุดของสิ่งอันดับสั่งที่กำหนดในบางชุด ผลที่ได้คือผลิตภัณฑ์ Cartesian วัฒนธรรมเชิงสัมพันธ์และ SQL ใช้ผิดวิธี / เกินอย่างน่าเศร้า "ผลิตภัณฑ์คาร์ทีเซียน" สำหรับผู้ประกอบการที่ทำให้เกิดแต่ไม่ใช่ผลิตภัณฑ์คาร์ทีเซียน เช่น Wikipedia! ฉันไม่เห็นด้วย - มันทำให้เข้าใจผิด / สับสน แต่ที่นี่ฉันโชคไม่ดีที่ฉันอธิบายเพียงอย่างเดียวว่า SQL cross join ทำงานในคำพูดของฉันเองและเลื่อนไปที่ Wikipedia อย่างไร ฉันติดป้ายกำกับผลลัพธ์ "ผลิตภัณฑ์คาร์ทีเซียนไขว้แบบแนวคิดระดับกลาง" ใช่ "คาร์ทีเซียน" สำหรับผู้ที่ใช้งาน / คาดหวังว่าจะได้รับความเสียหาย
philipxy

1
นี่คือคำตอบที่ถูกต้องซึ่งต่างจากคำตอบที่ได้คะแนนสูงกว่า เป็นเรื่องปกติของ SQL ที่คำอธิบายที่สมเหตุสมผลฟังดูดีมีรูปแบบที่ดีโดยมีรูปภาพเป็นตัวควบคุมเนื้อหาทางการศึกษาแม้ว่าจะไม่สามารถเข้าใจหรือกำหนดพื้นฐานของภาษาได้ก็ตาม
Charles Roddie

23

เข้าร่วม Inner

การเข้าร่วมที่แสดงเฉพาะแถวที่มีการจับคู่ทั้งในตารางที่เข้าร่วมนั้นเรียกว่าการรวมภายใน นี่คือการเข้าร่วมเริ่มต้นในแบบสอบถามและดูนักออกแบบ

ไวยากรณ์สำหรับ Inner Join

SELECT t1.column_name,t2.column_name
FROM table_name1 t1
INNER JOIN table_name2 t2
ON t1.column_name=t2.column_name

ข้ามเข้าร่วม

การเข้าร่วมไขว้ที่สร้างผลิตภัณฑ์คาร์ทีเซียนของตารางที่เกี่ยวข้องในการเข้าร่วม ขนาดของผลิตภัณฑ์คาร์ทีเซียนคือจำนวนแถวในตารางแรกคูณด้วยจำนวนแถวในตารางที่สอง

ไวยากรณ์สำหรับการเข้าร่วมข้าม

SELECT * FROM table_name1
CROSS JOIN table_name2

หรือเราสามารถเขียนมันในอีกทางหนึ่งได้

SELECT * FROM table_name1,table_name2

ตอนนี้ตรวจสอบแบบสอบถามด้านล่างเพื่อเข้าร่วมข้าม

ตัวอย่าง

SELECT * FROM UserDetails
CROSS JOIN OrderDetails

หรือ

SELECT * FROM UserDetails, OrderDetails

11

โปรดจำไว้ว่าถ้ามีการเพิ่มส่วนคำสั่ง WHERE ไว้การรวม cross จะทำหน้าที่เป็นการรวมภายใน ตัวอย่างเช่นแบบสอบถาม Transact-SQL ต่อไปนี้สร้างชุดผลลัพธ์เดียวกัน โปรดดูที่http://technet.microsoft.com/en-us/library/ms190690(v=sql.105).aspx


8

ข้ามเข้าร่วม

ดังที่ฉันได้อธิบายไว้ในบทความนี้ CROSS JOIN นั้นมีวัตถุประสงค์เพื่อสร้างผลิตภัณฑ์คาร์ทีเซียน

ผลิตภัณฑ์คาร์ทีเซียนใช้สองชุด A และ B และสร้างการเรียงสับเปลี่ยนที่เป็นไปได้ทั้งหมดของการบันทึกคู่จากสองชุดของข้อมูลที่กำหนด

ตัวอย่างเช่นสมมติว่าคุณมีตารางต่อไปนี้ranksและsuitsฐานข้อมูล:

การจัดอันดับและเหมาะสมกับตาราง

และranksมีแถวต่อไปนี้:

| name  | symbol | rank_value |
|-------|--------|------------|
| Ace   | A      | 14         |
| King  | K      | 13         |
| Queen | Q      | 12         |
| Jack  | J      | 11         |
| Ten   | 10     | 10         |
| Nine  | 9      |  9         |

ในขณะที่suitsตารางมีระเบียนต่อไปนี้:

| name    | symbol |
|---------|--------|
| Club    |       |
| Diamond |       |
| Heart   |       |
| Spade   |       |

ในฐานะที่เป็น CROSS JOIN แบบสอบถามเหมือนคนต่อไปนี้:

SELECT
   r.symbol AS card_rank,
   s.symbol AS card_suit
FROM
   ranks r
CROSS JOIN
   suits s

จะสร้างการเรียงสับเปลี่ยนranksและsuitesคู่ที่เป็นไปได้ทั้งหมด:

| card_rank | card_suit |
|-----------|-----------|
| A         |          |
| A         |          |
| A         |          |
| A         |          |
| K         |          |
| K         |          |
| K         |          |
| K         |          |
| Q         |          |
| Q         |          |
| Q         |          |
| Q         |          |
| J         |          |
| J         |          |
| J         |          |
| J         |          |
| 10        |          |
| 10        |          |
| 10        |          |
| 10        |          |
| 9         |          |
| 9         |          |
| 9         |          |
| 9         |          |

เข้าร่วมภายใน

ในทางกลับกัน INNER JOIN จะไม่ส่งคืนผลิตภัณฑ์คาร์ทีเซียนของชุดข้อมูลที่เข้าร่วมทั้งสองชุด

แทนการเข้าร่วมภายในใช้องค์ประกอบทั้งหมดจากตารางด้านซ้ายและจับคู่กับระเบียนบนตารางด้านขวาเพื่อ:

  • หากไม่มีการจับคู่ระเบียนบนตารางด้านขวาแถวด้านซ้ายจะถูกกรองออกจากชุดผลลัพธ์
  • สำหรับระเบียนที่ตรงกันในตารางด้านขวาแถวด้านซ้ายจะถูกทำซ้ำราวกับว่ามีผลิตภัณฑ์คาร์ทีเซียนระหว่างระเบียนนั้นและระเบียนลูกที่เกี่ยวข้องทั้งหมดในตารางด้านขวา

ตัวอย่างเช่นสมมติว่าเรามีความสัมพันธ์แบบหนึ่งต่อหลายตารางระหว่างตารางหลักpostและpost_commentตารางย่อยที่มีลักษณะดังนี้:

ความสัมพันธ์ของตารางแบบหนึ่งต่อหลายคน

ตอนนี้ถ้าpostตารางมีระเบียนต่อไปนี้:

| id | title     |
|----|-----------|
| 1  | Java      |
| 2  | Hibernate |
| 3  | JPA       |

และpost_commentsตารางมีแถวเหล่านี้:

| id | review    | post_id |
|----|-----------|---------|
| 1  | Good      | 1       |
| 2  | Excellent | 1       |
| 3  | Awesome   | 2       |

แบบสอบถาม INNER JOIN เหมือนกับข้อความต่อไปนี้:

SELECT
   p.id AS post_id,
   p.title AS post_title,
   pc.review  AS review
FROM post p
INNER JOIN post_comment pc ON pc.post_id = p.id

กำลังจะรวมpostระเบียนทั้งหมดพร้อมกับระเบียนที่เกี่ยวข้องทั้งหมดpost_comments:

| post_id | post_title | review    |
|---------|------------|-----------|
| 1       | Java       | Good      |
| 1       | Java       | Excellent |
| 2       | Hibernate  | Awesome   |

โดยพื้นฐานแล้วคุณสามารถนึกถึง INNER JOIN ในฐานะ CROSS JOIN ที่ถูกกรองซึ่งมีเพียงระเบียนที่ตรงกันเท่านั้นที่ถูกเก็บไว้ในชุดผลลัพธ์สุดท้าย

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการ INNER JOIN งานตรวจสอบบทความนี้ได้เป็นอย่างดี


"INNER JOIN ไม่ส่งคืนผลิตภัณฑ์คาร์ทีเซียนของชุดข้อมูลที่เข้าร่วมทั้งสองชุด" เป็นอะไรที่ค่อนข้างมากเมื่อ x INNER JOIN y ใน 1 = 1 ส่งคืน ดังนั้นคือ "แทน" เมื่อสิ่งที่คุณพยายามจะบอกว่าทำจริง (แน่นอน) ส่งคืนสำหรับเงื่อนไข 1 = 1 ยกเว้นว่าภาษาในสัญลักษณ์แสดงหัวข้อย่อยไม่ได้อธิบายอย่างชัดเจนถึงผลของการรวมภายใน อะไรคือสิ่งที่อธิบายว่ามันเป็น cross เข้าร่วมแถวน้อยกว่าที่ไม่ตรงตามเงื่อนไข ในทำนองเดียวกันภาษา cross cross ของคุณที่ใช้ "ชุดค่าผสม" ไม่ชัดเจน
philipxy

7

SQL Server ยังยอมรับสัญลักษณ์ที่ง่ายกว่าของ:

SELECT A.F, 
       B.G, 
       C.H 
  FROM TABLE_A A, 
       TABLE_B B, 
       TABLE_C C
 WHERE A.X = B.X 
   AND B.Y = C.Y

การใช้สัญลักษณ์ที่เรียบง่ายนี้ไม่จำเป็นต้องกังวลเกี่ยวกับความแตกต่างระหว่างการรวมภายในและการรวมภาพ แทนที่จะเป็นสองส่วน "เปิด" มีประโยค "WHERE" เพียงประโยคเดียวที่ทำงานได้ หากคุณมีปัญหาใด ๆ ในการหาว่าคำสั่ง "JOIN" "ON" ไปที่ใดให้ละทิ้งสัญรูป "JOIN" และใช้สิ่งที่ง่ายกว่าข้างต้น

มันไม่ได้โกง


2

ขณะที่เขียนแบบสอบถามโดยใช้การรวมภายในระเบียนจะดึงข้อมูลจากทั้งสองตารางหากเงื่อนไขตรงกับทั้งสองตารางนั่นคือการจับคู่ที่ตรงกันของคอลัมน์ทั่วไปในทั้งสองตาราง

ในขณะที่เขียนแบบสอบถามโดยใช้ cross เข้าร่วมผลลัพธ์จะเหมือนกับผลิตภัณฑ์คาร์ทีเซียนที่ไม่มีระเบียนในทั้งสองตาราง ตัวอย่างถ้า table1 มี 2 บันทึกและ table2 มี 3 บันทึกผลลัพธ์ของการสืบค้นคือ 2 * 3 = 6 บันทึก

ดังนั้นอย่าเข้าร่วม cross cross จนกว่าคุณจะต้องการสิ่งนั้น


2
เฉพาะในกรณีที่ข้อที่หายไป!
epitka

2

การเข้าร่วมแบบข้ามและการรวมภายในนั้นเหมือนกันโดยมีความแตกต่างเพียงอย่างเดียวที่ในการเข้าร่วมภายในเราจะกรองผลลัพธ์ของผลิตภัณฑ์คาร์ทีเซียนอย่างระมัดระวัง

table1
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    option1  |
|    A     |      B1     |    option2  |
x--------------------------------------x

table2
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    optionB1 |
|    A1    |      B1     |    optionB2 |
x--------------------------------------x

 cross join
  A,B,option1,A,B,optionB1
  A,B,option1,A1,B1,optionB2
  A,B1,option2,A,B,optionB1
  A,B1,option2,A1,B1,optionB2

 inner join on field1 (only with the value is the same in both tables)
  A,B,option1,A,B,optionB1
  A,B1,option2,A,B,optionB1

 inner join on field1
  A,B,option1,A,B,optionB1

มันเป็นการออกแบบข้อมูลของเราที่เราตัดสินใจว่ามีเพียงหนึ่งกรณีของเขตข้อมูลที่เราใช้สำหรับการเข้าร่วม เข้าร่วม cross เท่านั้นเข้าร่วมทั้งสองตารางและรับเฉพาะบรรทัดที่ทำนิพจน์บูลีนพิเศษ

โปรดทราบว่าถ้าเขตข้อมูลที่เรากำลังทำส่วนร่วมอยู่นั้นจะเป็นโมฆะในตารางทั้งสองเราจะผ่านตัวกรอง มันขึ้นอยู่กับเราหรือผู้ผลิตฐานข้อมูลเพื่อเพิ่มกฎพิเศษเพื่อหลีกเลี่ยงหรืออนุญาตให้มีค่าว่าง การปฏิบัติตามพื้นฐานเป็นเพียงการเข้าร่วมไขว้ตามด้วยตัวกรอง


0

การรวมภายในจะให้ผลลัพธ์ของการจับคู่ที่ตรงกันระหว่างสองตารางโดยที่การรวมเข้าด้วยกันทำให้คุณมีการผสมที่เป็นไปได้ระหว่างสองตาราง


0

A = {1,5,3,4,6,7,9,8} B = {2,8,5,4,3,6,9}

cross join ทำหน้าที่เป็นผลิตภัณฑ์คาร์ทีเซียน A ✖ B = {1,2}, {1,8} ... , {5,2}, {5,8}, {5,5} ..... {3,3} ... , {6,6} .... {8,9} และส่งคืนชุดผลลัพธ์แบบยาวนี้ ..

เมื่อประมวลผลinner joinเสร็จแล้วผ่านผลิตภัณฑ์คาร์ทีเซียนและเลือกคู่ที่ตรงกัน .. ถ้าคิดว่าคู่นี้สั่งเป็นคีย์หลักของตารางสองและในการค้นหาคำสั่ง A = B แล้วinner joinเลือก {5,5}, {4,4}, {6,6} , {9,9} และส่งคืนคอลัมน์ถามในส่วนคำสั่งที่เลือกซึ่งเกี่ยวข้องกับรหัสเหล่านี้

ถ้าcross joinบน = b inner joinแล้วมันเป็นผลผลเป็นชุดเดียวกัน inner joinในกรณีที่ยังใช้


-1

ขึ้นอยู่กับผลลัพธ์ที่คุณคาดหวัง

การรวมข้ามจะจับคู่แถวทั้งหมดในตารางหนึ่งกับแถวทั้งหมดในอีกตารางหนึ่ง การเข้าร่วมภายในเป็นการจับคู่บนเขตข้อมูลหรือเขตข้อมูล หากคุณมีตารางหนึ่งตารางที่มี 10 แถวและอีก 10 แถวจากนั้นทั้งสองตัวจะทำงานต่างกัน

การเข้าร่วมไขว้จะมีการคืน 100 แถวและจะไม่เกี่ยวข้องกันเพียง แต่สิ่งที่เรียกว่าผลิตภัณฑ์คาร์ทีเซียน การเข้าร่วมภายในจะจับคู่ระเบียนกับแต่ละอื่น ๆ สมมติว่าหนึ่งมีคีย์หลักและที่เป็นต่างประเทศในอื่น ๆ ที่คุณจะได้รับ 10 แถวกลับ

การเข้าร่วมไขว้มียูทิลิตี้ทั่วไปที่ จำกัด แต่มีอยู่เพื่อความสมบูรณ์และอธิบายผลลัพธ์ของการเข้าร่วมตารางที่ไม่มีความสัมพันธ์เพิ่มลงในแบบสอบถาม คุณอาจใช้การเข้าร่วมไขว้เพื่อสร้างรายการชุดคำหรือสิ่งที่คล้ายกัน การเข้าร่วมภายในในทางกลับกันคือการเข้าร่วมที่พบบ่อยที่สุด


ไม่ให้สับสนทุกคน ฉันพยายามทำให้คำตอบสั้นลง นี่เป็นคำตอบสั้น ๆ ที่ดีที่สุด
Shrikant Jadhav
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.