Saya telah melihat kesalahan serupa pada SO, tetapi saya tidak menemukan solusi untuk masalah saya. Saya punya pertanyaan SQL seperti:
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;
Ketika saya menjalankan kueri ini, hasil kesalahan adalah:
Pengidentifikasi multi-bagian "a.maxa" tidak dapat diikat. Mengapa?
P / s: jika saya membagi kueri menjadi 2 permintaan individu, itu berjalan ok.
SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyen
FROM phuongxa a ,
quanhuyen b
WHERE a.maxa <> '99'
AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;
dan
SELECT maxa ,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
AND 'Sep 5 2011'
GROUP BY maxa;
sql
sql-server
sql-server-2005
PhamMinh
sumber
sumber
phuongxa
tabel termasuk kolommaxa
?Jawaban:
Anda mencampur gabungan implisit dengan gabungan eksplisit. Itu diperbolehkan, tetapi Anda harus mengetahui cara melakukannya dengan benar.
Masalahnya adalah, gabungan eksplisit (yang diimplementasikan menggunakan
JOIN
kata kunci) diutamakan daripada yang tersirat ('koma' bergabung, di mana kondisi gabungan ditentukan dalamWHERE
klausa).Inilah garis besar kueri Anda:
Anda mungkin mengharapkannya berperilaku seperti ini:
yaitu, kombinasi tabel
a
danb
digabungkan dengan tabeldkcd
. Sebenarnya, yang terjadi adalahyaitu, seperti yang mungkin sudah Anda pahami,
dkcd
digabungkan secara khusus melawanb
dan hanyab
, maka hasil gabungan digabungkan dengana
dan disaring lebih lanjut denganWHERE
klausa. Dalam hal ini, referensi apa puna
padaON
klausa tidak valid,a
tidak diketahui pada saat itu. Itu sebabnya Anda mendapatkan pesan kesalahan.Jika saya jadi Anda, saya mungkin akan mencoba untuk menulis ulang pertanyaan ini, dan salah satu solusi yang mungkin adalah:
Di sini tabel
a
danb
digabungkan terlebih dahulu, kemudian hasilnya digabungkan kedkcd
. Pada dasarnya, ini adalah permintaan yang sama dengan Anda, hanya menggunakan sintaks yang berbeda untuk salah satu yang bergabung, yang membuat perbedaan besar: referensia.maxa
dalamdkcd
kondisi bergabungnya sekarang benar-benar valid.Seperti @Aaron Bertrand telah mencatat dengan benar, Anda mungkin harus memenuhi syarat
maxa
dengan alias tertentu, mungkina
, diORDER BY
klausa.sumber
ORDER BY maxa
, terima kasih. Mengenai tanggalnya, saya percaya itulah cara OP memilih untuk menentukannya di lingkungan mereka.Terkadang kesalahan ini terjadi ketika Anda menggunakan skema (dbo) dalam kueri dengan cara yang salah.
misalnya jika Anda menulis:
Anda akan mendapatkan kesalahan.
Dalam situasi ini ubahlah menjadi:
sumber
jika Anda telah memberikan nama alies, ubahlah itu menjadi nama sebenarnya
sebagai contoh
ubah itu menjadi
sumber
Saya berjuang dengan pesan kesalahan yang sama di SQL SERVER, karena saya memiliki banyak gabungan, mengubah urutan gabungan memecahkannya untuk saya.
sumber
Dalam kasus saya masalahnya ternyata adalah nama alias yang saya berikan ke meja. "oa" tampaknya tidak dapat diterima untuk SQL Server.
sumber
Saya mengalami kesalahan yang sama dari JDBC. Memeriksa semuanya dan permintaan saya baik-baik saja. Ternyata, di mana klausa saya punya argumen:
Dan nilai argumen yang saya sampaikan adalah nol. Ini juga memberikan kesalahan yang sama yang menyesatkan karena ketika Anda mencari di internet Anda berakhir bahwa ada sesuatu yang salah dengan struktur permintaan tetapi tidak dalam kasus saya. Hanya berpikir seseorang mungkin menghadapi masalah yang sama
sumber
Apa yang berhasil bagi saya adalah mengubah klausa WHERE saya menjadi subquery SELECT
DARI:
UNTUK:
sumber
Saya baru mengenal SQL, tetapi menemukan masalah ini dalam kursus yang saya ambil dan menemukan bahwa menetapkan kueri untuk proyek secara khusus membantu menghilangkan kesalahan multi-bagian. Sebagai contoh, proyek yang saya buat adalah CTU SQL Project jadi saya memastikan saya memulai skrip saya dengan USE [CTU SQL Project] sebagai baris pertama saya seperti di bawah ini.
sumber
Jika kesalahan ini terjadi dalam
UPDATE
, periksa ulangJOIN
di atas meja dengan kolom / bidang yang menyebabkan kesalahan.Dalam kasus saya ini adalah karena kurangnya
JOIN
itu sendiri, yang menghasilkan kesalahan yang sama karena bidang yang tidak diketahui (seperti yang Andriy tunjukkan ).sumber
Sebagai gantinya Anda dapat mencoba bergabung dengan tabel seperti,
Ini seharusnya bekerja
sumber
sumber
Kesalahan saya adalah menggunakan bidang yang tidak ada dalam tabel.
table1.field1 => tidak ada
table2.field1 => benar
Perbaiki Nama Meja Anda.
kesalahan saya terjadi karena menggunakan DENGAN
saat digunakan bergabung dengan tabel lain ...
sumber
Apakah Anda lupa bergabung dengan beberapa tabel? Jika tidak maka Anda mungkin perlu menggunakan beberapa alias.
sumber
Saya juga berjuang dengan kesalahan ini dan berakhir dengan strategi yang sama dengan jawabannya. Saya memasukkan jawaban saya hanya untuk mengonfirmasi bahwa ini adalah strategi yang harus bekerja.
Berikut adalah contoh di mana saya melakukan pertama satu gabungan dalam antara dua tabel yang saya tahu punya data dan kemudian dua gabungan luar kiri pada tabel yang mungkin memiliki baris yang sesuai yang bisa kosong. Anda mencampur gabungan dalam dan gabungan luar untuk mendapatkan hasil dengan tabel lintas data alih-alih melakukan sintaks dipisahkan koma default antara tabel dan melewatkan baris di gabungan yang Anda inginkan.
Pertama: Lakukan penggabungan bagian dalam di antara tabel yang Anda harapkan memiliki data yang cocok. Bagian kedua: Lanjutkan dengan gabungan luar untuk mencoba mengambil data di tabel lain, tetapi ini tidak akan memfilter hasil yang Anda setel jika sambungan luar tabel ke tidak memiliki data yang sesuai atau cocok dengan kondisi yang Anda atur di predikat / kondisi on.
sumber
Kesalahan ini juga dapat disebabkan oleh tidak adanya koma di
,
antara nama kolom dalam pernyataan SELECT.misalnya:
sumber