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'
sql-server
Matematika
sumber
sumber
Jawaban:
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):
sumber
INNER JOIN (SELECT * FROM table1 WHERE type = 0) table1
. Itu mungkin membuatnya semakin jelas apa yang terjadi.ON
klausa gabungan atauWHERE
klausa bisa sangat berarti jika gabungan itu adalahOUTER JOIN
. Jika suatu kondisi gagal dalamON
klausa, baris utama masih termasuk (tanpa baris luar yang cocok); jika gagal dalamWHERE
klausa, maka baris utama dikecualikan dari hasil yang ditetapkan.Melihat
where
klausa, baris yang ditunjuk olehtable1
memerlukan kolomtype
untuk = '0' dan baris yang ditunjuk olehtable1alias
membutuhkan kolomcolumna
untuk = 'samb'.Mungkin ada beberapa baris
table1
untuk hal yang samaid3
?sumber
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)
sumber
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.
sumber