Apa alasan untuk menggunakan double inner join dalam pernyataan SQL ini?

10

Saya melihat permintaan SQL warisan ini. Bagian yang tidak bisa saya dapatkan adalah mengapa bagian dalamnya bergabung dengan tabel yang sama dua kali pada kolom yang sama. Saya berbicara tentang Table1 dan Table1 bergabung dengan alias "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'
Matematika
sumber

Jawaban:

27

Mungkin membantu untuk menulis ulang kueri seperti ini, jadi jelas bahwa 2 gabungan berbeda , yaitu gabungan tersebut untuk subset yang berbeda (dari tabel yang sama):

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' 
ypercubeᵀᴹ
sumber
bukan WHERE yang akan diterapkan SETELAH bergabung, yaitu saya akan setuju jika kendala itu adalah bagian dari pernyataan bergabung, yaitu terhubung dengan AND, tetapi WHERE dalam semua pengalaman diterapkan pada hasil dari bergabung menyaring baris dari tabel gabungan, tidak memengaruhi gabungan aktual.
Frank Hopkins
3
@ Darwing Sejauh yang saya tahu, tidak masalah di mana Anda meletakkan ketentuan, karena tugas pengoptimal permintaan untuk membuat rencana pengeluaran terbaik. Namun lebih baik untuk menempatkan mereka di sebelah bergabung karena membuat mereka lebih mudah dibaca tetapi itu hanya pendapat
Matematika
Bahkan jika itu terjadi SETELAH bergabung dengan hasil bergabung berbeda pada akhirnya. Dan ya, baris yang bergabung biasanya difilter sebelum bergabung karena meningkatkan kinerja.
Gherman
1
Ini juga setara dengan bergabung dengan subquery, misalnya INNER JOIN (SELECT * FROM table1 WHERE type = 0) table1. Itu mungkin membuatnya semakin jelas apa yang terjadi.
Barmar
3
@Mathematics - apakah suatu kondisi berada dalam ONklausa gabungan atau WHEREklausa bisa sangat berarti jika gabungan itu adalah OUTER JOIN. Jika suatu kondisi gagal dalam ONklausa, baris utama masih termasuk (tanpa baris luar yang cocok); jika gagal dalam WHEREklausa, maka baris utama dikecualikan dari hasil yang ditetapkan.
RDFozz
8

Melihat whereklausa, baris yang ditunjuk oleh table1memerlukan kolom typeuntuk = '0' dan baris yang ditunjuk oleh table1aliasmembutuhkan kolom columnauntuk = 'samb'.

Mungkin ada beberapa baris table1untuk hal yang sama id3?

Scott Hodgin
sumber
2

Tanpa melihat struktur tabel - pendekatannya bisa menggunakan indeks non-penutup yang lebih kecil dan kemudian bergabung ke dalam tabel pada indeks penutup yang lebih besar untuk mendapatkan sisa baris untuk menghindari operasi 'Pencarian Kunci' dan untuk menghindari memodifikasi indeks yang ada (atau jika Anda tidak dapat mengubah indeks)

Allan S. Hansen
sumber
2

Setiap kali tabel muncul lebih dari satu kali dalam gabungan kompleks, biasanya karena ada entitas yang berpartisipasi dalam lebih dari satu hubungan. Itu tampaknya menjadi masalah di sini, dilihat dari jawaban yang diberikan @Ypercube.

Entitas dan hubungan umumnya dipahami melalui semantik data, dan koneksi ke materi pokok yang mendasarinya. Jika sistem lawas Anda dibangun dengan hati-hati, mereka mungkin berhati-hati untuk menganalisis materi pelajaran, dan dengan cermat menentukan setiap elemen data. Mereka bahkan mungkin telah membangun model Entity-Relationship. Semua pekerjaan yang hati-hati itu mungkin telah hilang, dan Anda terjebak merekonstruksi dengan menggali ke masa lalu. Ini sedikit mirip arkeologi.

Dengan nama tabel seperti Table1, kami tidak punya petunjuk tentang cara kerja subjek Anda. Dan bahkan jika namanya deskriptif, pemahaman kami tentang materi pelajaran sistem Anda mungkin sangat berbeda dari apa yang dibutuhkan dalam kasus Anda. Itu akan terserah Anda.

Walter Mitty
sumber