Ralat pertanyaan SQL: "Tidak boleh mengikat pengecam berbilang bahagian"
Huraian Masalah
Semasa melaksanakan pertanyaan SQL, saya mengalami ralat: "Tidak boleh mengikat pengecam berbilang bahagian 'a.maxa'". Walaupun selepas membahagikan pertanyaan kepada subkueri berasingan, ralat masih wujud.
Berikut ialah contoh pertanyaan yang salah:
<code class="language-sql">SELECT DISTINCT a.maxa , b.mahuyen , a.tenxa , b.tenhuyen , ISNULL(dkcd.tong, 0) AS tongdkcd FROM phuongxa a , quanhuyen b LEFT OUTER JOIN ( SELECT maxa , COUNT(*) AS tong FROM khaosat WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011' GROUP BY maxa ) AS dkcd ON dkcd.maxa = a.maxa WHERE a.maxa <> '99' AND LEFT(a.maxa, 2) = b.mahuyen ORDER BY maxa;</code>
Sebab ralat
Ralat ini disebabkan oleh pencampuran yang tidak betul antara cantuman eksplisit dan cantuman tersirat dalam pertanyaan. Cantuman eksplisit, dinyatakan dengan kata kunci JOIN, diutamakan daripada cantuman tersirat (dinyatakan menggunakan koma dan klausa WHERE).
Dalam pertanyaan yang diberikan, anda menggabungkan jadual a dan b secara eksplisit, dan kemudian secara tersirat dkcd kepada hasil gabungan itu menggunakan sintaks LEFT OUTER JOIN. Walau bagaimanapun, ini menyebabkan rujukan kepada a.maxa dalam klausa ON menjadi tidak sah kerana a bukan sebahagian daripada sambungan eksplisit dkcd.
Penyelesaian
Untuk menyelesaikan isu ini, pertimbangkan untuk menulis semula pertanyaan untuk menggunakan sintaks gabungan yang konsisten. Penyelesaian yang mungkin ialah:
<code class="language-sql">SELECT DISTINCT a.maxa, b.mahuyen, a.tenxa, b.tenhuyen, ISNULL(dkcd.tong, 0) AS tongdkcd FROM phuongxa a INNER JOIN quanhuyen b ON LEFT(a.maxa, 2) = b.mahuyen LEFT OUTER JOIN ( SELECT maxa, COUNT(*) AS tong FROM khaosat WHERE CONVERT(datetime, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011' GROUP BY maxa ) AS dkcd ON dkcd.maxa = a.maxa WHERE a.maxa <> '99' ORDER BY a.maxa;</code>
Dalam pertanyaan yang diubah suai ini, cantuman eksplisit ditakrifkan dengan jelas dan rujukan kepada a.maxa adalah sah dalam keadaan ON. Seperti yang dicadangkan oleh Aaron Bertrand, anda juga harus menyatakan alias dalam klausa ORDER BY untuk mengelakkan sebarang kemungkinan kekaburan.
Atas ialah kandungan terperinci Mengapa Pertanyaan SQL Saya Menghasilkan Ralat 'Pengecam berbilang bahagian tidak dapat diikat' dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!