Rumah > pangkalan data > tutorial mysql > Mengapa Pertanyaan SQL Saya Menghasilkan Ralat 'Pengecam berbilang bahagian tidak dapat diikat' dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Pertanyaan SQL Saya Menghasilkan Ralat 'Pengecam berbilang bahagian tidak dapat diikat' dan Bagaimana Saya Boleh Membetulkannya?

Mary-Kate Olsen
Lepaskan: 2025-01-17 03:37:08
asal
359 orang telah melayarinya

Why Does My SQL Query Result in a

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan