Rumah >pangkalan data >tutorial mysql >Mengapakah saya mendapat ralat 'Pengecam berbilang bahagian tidak boleh terikat' dalam pertanyaan SQL saya dan bagaimana saya boleh membetulkannya?

Mengapakah saya mendapat ralat 'Pengecam berbilang bahagian tidak boleh terikat' dalam pertanyaan SQL saya dan bagaimana saya boleh membetulkannya?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-17 03:42:10326semak imbas

Why am I getting the

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn