Den flerdelte identifikatoren kunne ikke bindes
Jeg har sett lignende feil på SO, men jeg finner ikke en løsning på problemet mitt. Jeg har en SQL-spørring som:
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;
Når jeg utfører denne spørringen, er feilresultatet:
Den flerdelte identifikatoren "a.maxa" kunne ikke bindes. Hvorfor?
P / s: Hvis jeg deler spørringen i 2 individuelle spørringer, kjører den 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;
og
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
Du blander implisitte sammenføyninger med eksplisitte sammenføyninger. Det er tillatt, men du må være klar over hvordan du gjør det på riktig måte.
Saken er at eksplisitte sammenføyninger (de som er implementert ved hjelp av nøkkelordet
JOIN
) har forrang over implisitte ('komma' sammenføyninger, der sammenføyningsbetingelsen er spesifisert iWHERE
-klausulen).Her er en oversikt over spørringen din:
Du forventer sannsynligvis at det skal oppføre seg slik:
det vil si at kombinasjonen av tabellene
a
ogb
slås sammen med tabellendkcd
. Det som faktisk skjer, er følgendedet vil si, som du kanskje allerede har forstått,
dkcd
er sammenføyd spesifikt motb
og bareb
, deretter kombineres resultatet av sammenføyningen meda
og filtreres videre medWHERE
-klausulen. I dette tilfellet er enhver referanse tila
iON
-klausulen ugyldig,a
er ukjent på det tidspunktet. Det er derfor du får feilmeldingen.Hvis jeg var deg, ville jeg sannsynligvis prøve å omskrive denne spørringen, og en mulig løsning kan være:
Her sammenføyes tabellene
a
ogb
først, deretter sammenføyes resultatet tildkcd
. I utgangspunktet er dette den samme spørringen som din, bare med en annen syntaks for en av sammenføyningene, noe som utgjør en stor forskjell: referansena.maxa
idkcd
's sammenføyningsbetingelse er nå absolutt gyldig.Som @Aaron Bertrand riktig har bemerket, bør du sannsynligvis kvalifisere
maxa
med et bestemt alias, sannsynligvisa
, iORDER BY
klausulen.Noen ganger oppstår denne feilen når du bruker skjemaet (dbo) i spørringen på feil måte.
for eksempel hvis du skriver:
vil du få feilen.
I disse situasjonene endrer du det til:
Jeg er ny i SQL, men kom over dette problemet i et kurs jeg tok og fant ut at å tilordne spørringen til prosjektet spesifikt bidro til å eliminere feilen i flere deler. For eksempel var prosjektet jeg opprettet CTU SQL Project, så jeg sørget for at jeg startet skriptet mitt med USE [CTU SQL Project] som min første linje som nedenfor.