Anda mencampur gabungan implisit dengan gabungan eksplisit. Itu diperbolehkan, tetapi Anda harus mengetahui cara melakukannya dengan benar.
Masalahnya, gabungan eksplisit (yang diimplementasikan menggunakan JOIN
kata kunci) lebih diutamakan daripada yang implisit (penggabungan 'koma', di mana kondisi penggabungan ditentukan dalam WHERE
klausa).
Berikut ini garis besar kueri Anda:
SELECT
…
FROM a, b LEFT JOIN dkcd ON …
WHERE …
Anda mungkin mengharapkannya berperilaku seperti ini:
SELECT
…
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …
yaitu, kombinasi tabel a
dan b
digabungkan dengan tabel dkcd
. Faktanya, yang terjadi adalah
SELECT
…
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …
yaitu, seperti yang mungkin sudah Anda pahami, dkcd
digabungkan secara khusus dengan b
dan hanya b
, kemudian hasil join digabungkan dengan a
dan disaring lebih lanjut dengan WHERE
ayat. Dalam hal ini, referensi apa pun ke a
di ON
klausa tidak valid, a
tidak diketahui pada saat itu. Itulah sebabnya Anda mendapatkan pesan kesalahan.
Jika saya jadi Anda, saya mungkin akan mencoba menulis ulang kueri ini, dan salah satu solusi yang mungkin adalah:
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
Berikut tabel a
dan b
di-join dulu, baru hasilnya di-join ke dkcd
. Pada dasarnya, ini adalah kueri yang sama dengan kueri Anda, hanya menggunakan sintaks yang berbeda untuk salah satu gabungan, yang membuat perbedaan besar:referensi a.maxa
di dkcd
kondisi bergabung sekarang benar-benar valid.
Seperti yang dicatat oleh @Aaron Bertrand dengan benar, Anda mungkin harus memenuhi syarat maxa
dengan alias tertentu, mungkin a
, di bagian ORDER BY
klausa.