Rumah >pangkalan data >tutorial mysql >Mengapakah saya mendapat ralat 'Pengecam berbilang bahagian tidak boleh terikat' dalam pertanyaan SQL saya dan bagaimana saya boleh membetulkannya?
Ralat dan penyelesaian pengecam berbilang bahagian SQL
Apabila mendapatkan semula dan memanipulasi data pangkalan data menggunakan pertanyaan SQL, anda sering menghadapi ralat "pengecam berbilang bahagian tidak boleh terikat", yang mengecewakan. Artikel ini akan membincangkan ralat ini dan penyelesaiannya untuk membantu anda menyelesaikan masalah yang serupa pada masa hadapan.
Ralat pemahaman
Ralat "Pengecam berbilang tidak boleh terikat" biasanya berlaku apabila pengecam berbilang bahagian (terdiri daripada alias jadual dan nama lajur) digunakan dalam pertanyaan tetapi tidak dipetik dengan betul. Keadaan ini berlaku apabila anda mencampurkan cantuman tersirat (menggunakan koma dalam klausa FROM) dan cantuman eksplisit (menggunakan kata kunci JOIN) dalam pertanyaan yang sama.
Penggunaan gabungan gabungan
Gabungan tersirat kurang eksplisit berbanding sambung eksplisit dan selalunya digunakan untuk memudahkan pertanyaan. Walau bagaimanapun, cantuman eksplisit diutamakan daripada cantuman tersirat. Ini bermakna jika anda mencampurkan cantuman tersurat dan tersirat dalam pertanyaan, syarat cantuman eksplisit akan diutamakan, mungkin mengatasi syarat cantuman tersirat.
Contoh pertanyaan
Mari kita lihat contoh pertanyaan yang disediakan dalam soalan:
<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>
Dalam pertanyaan ini, cantuman eksplisit antara 'b' dan 'dkcd' menggunakan klausa ON diutamakan daripada cantuman tersirat antara 'a' dan 'dkcd'. Ini menyebabkan rujukan kepada 'a.maxa' dalam klausa ON menjadi tidak sah kerana 'a' belum bercantum dengan 'dkcd' pada ketika ini.
Penyelesaian: Tulis semula pertanyaan
Untuk menyelesaikan ralat ini, tulis semula pertanyaan untuk menggunakan gabungan eksplisit untuk semua perhubungan jadual:
<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 ditulis semula ini, jadual 'a' dicantumkan dengan 'b' menggunakan INNER JOIN yang eksplisit. Hasil gabungan ini kemudiannya digabungkan dengan 'dkcd' menggunakan LEFT OUTER JOIN yang jelas. Ini memastikan bahawa rujukan kepada 'a.maxa' dalam syarat gabungan dkcd adalah sah.
Nota Tambahan
Perlu dinyatakan bahawa dalam klausa ORDER BY, adalah lebih baik untuk melayakkan lajur 'maxa' menggunakan alias jadual kerana ia menghalang kekaburan dan kemungkinan ralat (apabila terdapat berbilang lajur dengan nama yang sama dalam pertanyaan). Dalam contoh ini, klausa ORDER BY ialah:
<code class="language-sql">ORDER BY a.maxa</code>
Atas ialah kandungan terperinci Mengapakah saya mendapat ralat 'Pengecam berbilang bahagian tidak boleh terikat' dalam pertanyaan SQL saya dan bagaimana saya boleh membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!