Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan SQL Saya Menghasilkan Ralat 'Pengecam Berbilang Bahagian Tidak Dapat Diikat'?
Menyelesaikan ralat "Pengecam berbilang tidak boleh terikat"
Ralat pertanyaan SQL "Pengecam berbilang bahagian 'a.maxa' tidak boleh terikat" menunjukkan konflik apabila mencampurkan cantuman tersirat dan eksplisit. Berikut adalah penjelasan terperinci:
Campurkan gabungan tersirat dan tersurat
Dalam pertanyaan yang disediakan, kedua-dua cantuman tersirat (jadual dipisahkan koma) dan cantuman eksplisit (kata kunci JOIN) digunakan. Walaupun ini dibenarkan, ia perlu dikendalikan dengan teliti untuk mengelakkan isu yang mengikat.
Memahami keutamaan sambungan
Sambungan eksplisit diutamakan daripada sambungan tersirat. Ini bermakna gabungan yang ditentukan menggunakan kata kunci JOIN akan dilakukan sebelum gabungan tersirat.
Rujukan alias tidak sah
Dalam pertanyaan anda, anda cuba melakukan cantuman tersirat antara hasil cantuman eksplisit antara jadual a dan b dan dkcd jadual lain. Walau bagaimanapun, disebabkan keutamaan gabungan eksplisit, jadual a tidak tersedia apabila cuba merujuk a.maxa menggunakan klausa ON dkcd. Di sinilah datangnya mesej ralat.
Tulis semula pertanyaan
Untuk menyelesaikan isu ini, anda perlu menulis semula pertanyaan menggunakan sintaks gabungan yang konsisten. Satu penyelesaian yang mungkin adalah dengan hanya menggunakan gabungan eksplisit:
<code class="language-sql">SELECT DISTINCT a.maxa, b.mahuyen, a.tenxa, b.tenhuyen, ISNULL(dkcd.tong, 0) AS tongdkcd FROM phuongxa AS a INNER JOIN quanhuyen AS b ON LEFT(a.maxa, 2) = b.mahuyen LEFT OUTER JOIN ( SELECT maxa, COUNT(*) AS tong FROM khaosat WHERE CONVERT(datetime, ngaylap, 103) BETWEEN '2011年9月1日' and '2011年9月5日' GROUP BY maxa ) AS dkcd ON dkcd.maxa = a.maxa WHERE a.maxa '99' ORDER BY a.maxa;</code>
Dalam pertanyaan ini, semua gabungan adalah eksplisit dan nama jadual layak menggunakan alias dalam semua kes. Ini memastikan bahawa rujukan kepada a.maxa dalam klausa ON dkcd adalah sah.
Penjelasan pada klausa ORDER BY
Seperti yang dicadangkan oleh @Aaron Bertrand, adalah disyorkan untuk melayakkan diri maxa dengan alias a khusus dalam klausa ORDER BY:
<code class="language-sql">ORDER BY a.maxa;</code>
Ini memastikan pengisihan dilakukan pada lajur yang betul. Format tarikh juga telah dilaraskan untuk memudahkan pemahaman.
Atas ialah kandungan terperinci Mengapa Pertanyaan SQL Saya Menghasilkan Ralat 'Pengecam Berbilang Bahagian Tidak Dapat Diikat'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!