Çok parçalı tanımlayıcı bağlanamadı
SO'da benzer hatalar gördüm, ancak sorunum için bir çözüm bulamadım. Şöyle bir SQL sorgum var:
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;
Bu sorguyu çalıştırdığımda hata sonucu şu oluyor:
Çok parçalı tanımlayıcı "a.maxa" bağlanamadı. Neden?
Not: sorguyu 2 ayrı sorguya bölersem, tamam çalışır.
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;
ve
SELECT maxa ,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
AND 'Sep 5 2011'
GROUP BY maxa;
184
3
Örtük birleştirmeler ile açık birleştirmeleri karıştırıyorsunuz. Buna izin verilir, ancak bunu nasıl doğru şekilde yapacağınızın farkında olmanız gerekir.
Mesele şu ki, açık birleştirmeler (
JOIN
anahtar sözcüğü kullanılarak uygulananlar) örtük olanlara (birleştirme koşulununWHERE
cümlesinde belirtildiği 'virgül' birleştirmeleri) göre önceliklidir.İşte sorgunuzun ana hatları:
Muhtemelen bu şekilde davranmasını bekliyorsunuz:
yani,
a
veb
tablolarının birleşimidkcd
tablosu ile birleştirilir. Aslında, olan şey şudurYani, zaten anlamış olabileceğiniz gibi,
dkcd
özellikleb
ile ve sadeceb
ile birleştirilir, daha sonra birleştirme sonucua
ile birleştirilir veWHERE
cümlesi ile daha fazla filtrelenir. Bu durumda,ON
cümlesindea
ya yapılan herhangi bir referans geçersizdir,a
o noktada bilinmemektedir. Hata mesajını almanızın nedeni budur.Yerinizde olsaydım, muhtemelen bu sorguyu yeniden yazmayı denerdim ve olası bir çözüm şöyle olabilir:
Burada önce
a
veb
tabloları birleştirilir, ardından sonuçdkcd
ile birleştirilir. Temel olarak, bu sizinkiyle aynı sorgudur, yalnızca birleştirmelerden biri için farklı bir sözdizimi kullanılır, bu da büyük bir fark yaratır:dkcd
'nin birleştirme koşulundakia.maxa
referansı artık kesinlikle geçerlidir.Aaron Bertrand'ın doğru bir şekilde belirttiği gibi,
SORDER BY
cümlesindemaxa
ifadesini belirli bir takma adla, muhtemelena
ile nitelendirmelisiniz.Bazen sorgunuzda şemanızı (dbo) yanlış bir şekilde kullandığınızda bu hata oluşur.
örneğin yazarsanız:
hatasını alırsınız.
Bu durumda bunu şu şekilde değiştirin:
SQL'de yeniyim, ancak aldığım bir kursta bu sorunla karşılaştım ve sorguyu projeye özel olarak atamanın çok parçalı hatayı ortadan kaldırmaya yardımcı olduğunu gördüm. Örneğin, oluşturduğum proje CTU SQL Projesiydi, bu yüzden betiğime aşağıdaki gibi ilk satır olarak USE [CTU SQL Projesi] ile başladığımdan emin oldum.