อะไรคือเหตุผลในการใช้ double inner join ในคำสั่ง SQL นี้


10

ฉันกำลังดูที่แบบสอบถาม SQL ดั้งเดิม บิตที่ฉันไม่สามารถรับได้คือสาเหตุที่มันเข้าร่วมตารางเดียวกันสองครั้งในคอลัมน์เดียวกัน ฉันกำลังพูดถึง Table1 และ Table1 เข้าร่วมกับนามแฝง "Table1Alias"

SELECT DISTINCT othercolumns,
                Table1Alias.columna
FROM   maintable
       INNER JOIN secondarytable
               ON maintable.id1 = secondarytable.a_id1
       INNER JOIN table1
               ON secondarytable.id2 = table1.id3
       INNER JOIN table1 Table1Alias
               ON secondarytable.id2 = Table1Alias.id3
       INNER JOIN thirdtable
               ON table1.id4 = thirdtable.id5
       INNER JOIN fourthtable
               ON thirdtable.id6 = fourthtable.id7
       INNER JOIN fivetable
               ON thirdtable.id8 = fivetable.id9
       INNER JOIN sixthtable
               ON Table1Alias.columna = sixthtable.id10
       LEFT JOIN seventhtable
              ON thirdtable.id11 = seventhtable.id12
WHERE  LEFT(secondarytable.type123, 2) BETWEEN '01' AND '09'
       AND secondarytable.type456 = 'cate'
       AND table1.type = '0'
       AND Table1Alias.columna = 'conn'

คำตอบ:


27

มันอาจช่วยในการเขียนแบบสอบถามเช่นนี้ดังนั้นจึงเป็นที่ชัดเจนว่า 2 joins จะแตกต่างกันเช่นการรวมเป็นส่วนย่อยที่แตกต่างกัน (ของตารางเดียวกัน):

FROM   maintable 
       INNER JOIN secondarytable 
               ON maintable.id1 = secondarytable.a_id1 
       INNER JOIN table1 
               ON secondarytable.id2 = table1.id3 
              AND table1.type = '0' 
       INNER JOIN table1 Table1Alias 
               ON secondarytable.id2 = Table1Alias.id3 
              AND Table1Alias.columna = 'conn' 
       INNER JOIN
       ...
WHERE  LEFT(secondarytable.type123, 2) BETWEEN '01' AND '09' 
       AND secondarytable.type456 = 'cate' 

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

3
@Darkwing เท่าที่ฉันรู้มันไม่สำคัญว่าคุณจะวางเงื่อนไขไว้ที่ใดเพราะเป็นหน้าที่ของตัวเพิ่มประสิทธิภาพการสืบค้นเพื่อให้ได้มาซึ่งแผนการที่ดีที่สุด อย่างไรก็ตามมันเป็นการดีกว่าที่จะวางพวกเขาไว้ใกล้ ๆ กับการรวมเข้าด้วยกันเพราะมันทำให้พวกเขาอ่านง่ายขึ้น แต่มันเป็นแค่ความคิดเห็น
คณิตศาสตร์เมื่อ

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

1
INNER JOIN (SELECT * FROM table1 WHERE type = 0) table1นอกจากนี้ยังเทียบเท่ากับการเข้าร่วมกับแบบสอบถามย่อยเช่น นั่นอาจทำให้ชัดเจนยิ่งขึ้นว่าเกิดอะไรขึ้น
Barmar

3
@ คณิตศาสตร์ - ไม่ว่าจะเป็นเงื่อนไขที่อยู่ในONข้อของการเข้าร่วมหรือในWHEREประโยคสามารถเรื่องใหญ่ถ้าเข้าร่วมOUTER JOINและ หากเงื่อนไขล้มเหลวในส่วนONคำสั่งแถวหลักจะยังคงรวมอยู่ (โดยไม่มีแถวด้านนอกที่ตรงกัน); หากล้มเหลวในส่วนWHEREคำสั่งแถวหลักจะถูกแยกออกจากชุดผลลัพธ์
RDFozz

8

เมื่อดูที่whereประโยคแถวที่ชี้ไปโดยtable1ต้องการให้คอลัมน์type= '0' และแถวที่ชี้ไปโดยtable1aliasต้องการให้คอลัมน์columna= 'conn'

บางทีอาจจะมีหลายแถวบนtable1สำหรับเดียวกันid3?


2

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


2

เมื่อใดก็ตามที่ตารางปรากฏมากกว่าหนึ่งครั้งในการเข้าร่วมที่ซับซ้อนมักเป็นเพราะมีเอนทิตีที่เข้าร่วมมากกว่าหนึ่งความสัมพันธ์ ดูเหมือนจะเป็นกรณีที่นี่ตัดสินโดยคำตอบที่ @Ypercube ให้

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

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

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