De meerdelige identifier kan niet worden gebonden

Ik heb soortgelijke fouten gezien op SO, maar ik vind geen oplossing voor mijn probleem.
Ik heb een SQL-query zoals:

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;

Als ik deze query uitvoer, is het resultaat van de fout:
De meerdelige identifier “a.maxa” kan niet worden gebonden.Waarom?

P/s: als ik de zoekopdracht in 2 individuele zoekopdrachten verdeel, werkt het goed.

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;

en

SELECT  maxa ,
        COUNT(*) AS tong
FROM    khaosat
WHERE   CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
                                        AND     'Sep 5 2011'
GROUP BY maxa;

Antwoord 1, autoriteit 100%

U combineert impliciete joins met expliciete joins. Dat mag, maar je moet wel weten hoe je dat op de juiste manier doet.

Het punt is dat expliciete joins (degenen die worden geïmplementeerd met het trefwoord JOIN) voorrang hebben op impliciete joins (de ‘komma’-joins, waarbij de join-voorwaarde wordt gespecificeerd in de WHERE-clausule).

Hier is een overzicht van uw zoekopdracht:

SELECT
  …
FROM a, b LEFT JOIN dkcd ON …
WHERE …

Je verwacht waarschijnlijk dat het zich zo gedraagt:

SELECT
  …
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …

dat wil zeggen, de combinatie van tabellen aen bwordt samengevoegd met de tabel dkcd. Wat er in feite gebeurt, is

SELECT
  …
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …

dat wil zeggen, zoals je misschien al hebt begrepen, wordt dkcdspecifiek samengevoegd tegen ben alleen b, dan is het resultaat van de samenvoeging wordt gecombineerd met aen verder gefilterd met de WHERE-clausule. In dit geval is elke verwijzing naar ain de ON-clausule ongeldig, ais op dat moment onbekend. Daarom krijg je de foutmelding.

Als ik jou was, zou ik waarschijnlijk proberen deze query te herschrijven, en een mogelijke oplossing zou kunnen zijn:

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

Hier worden eerst de tabellen aen bsamengevoegd, daarna wordt het resultaat samengevoegd met dkcd. In principe is dit dezelfde query als de jouwe, alleen met een andere syntaxis voor een van de joins, wat een groot verschil maakt: de verwijzing a.maxain de dkcd‘ s deelnamevoorwaarde is nu absoluut geldig.

Zoals @Aaron Bertrand terecht heeft opgemerkt, moet u waarschijnlijk maxakwalificeren met een specifieke alias, waarschijnlijk a, in de ORDER BY-clausule .


Antwoord 2, autoriteit 18%

Soms treedt deze fout op wanneer u uw schema (dbo) op een verkeerde manier in uw zoekopdracht gebruikt.

bijvoorbeeld als je schrijft:

select dbo.prd.name
from dbo.product prd

u krijgt de foutmelding.

Verander het in deze situaties in:

select prd.name
from dbo.product prd

Antwoord 3, autoriteit 6%

als je alies naam hebt gegeven, verander dat dan in echte naam

bijvoorbeeld

SELECT  
    A.name,A.date
  FROM [LoginInfo].[dbo].[TableA] as A
   join 
  [LoginInfo].[dbo].[TableA] as B 
  on  [LoginInfo].[dbo].[TableA].name=[LoginInfo].[dbo].[TableB].name;

verander dat in

SELECT  
    A.name,A.date
  FROM [LoginInfo].[dbo].[TableA] as A
   join 
  [LoginInfo].[dbo].[TableA] as B 
  on  A.name=B.name;

Antwoord 4, autoriteit 5%

Ik worstelde met dezelfde foutmelding in SQL SERVER, omdat ik meerdere joins had, waardoor de volgorde van de joinshet voor mij oploste.


Antwoord 5, autoriteit 2%

In mijn geval bleek het probleem de aliasnaam te zijn die ik aan de tabel had gegeven. “oa” lijkt niet acceptabel voor SQL Server.


Antwoord 6

Wat voor mij werkte, was om mijn WHERE-clausule te veranderen in een SELECT-subquery

VAN:

   DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = [dbo].FetchedTagTransferData.IssueId

NAAR:

   DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = (SELECT NoteId FROM FetchedTagTransferData)

Antwoord 7

Ik had dezelfde fout van JDBC. Alles gecontroleerd en mijn vraag was in orde. Bleek, in waar clausule heb ik een argument:

where s.some_column = ?

En de waarde van het argument dat ik aanhaalde was nul. Dit geeft ook dezelfde fout die misleidend is, want als je op internet zoekt, kom je erachter dat er iets mis is met de zoekstructuur, maar dat is in mijn geval niet het geval. Ik dacht gewoon dat iemand met hetzelfde probleem te maken zou kunnen hebben


Antwoord 8

Ik ben nieuw in SQL, maar kwam dit probleem tegen tijdens een cursus die ik volgde en ontdekte dat het toewijzen van de query aan het project specifiek hielp om de meerdelige fout te elimineren. Het project dat ik maakte was bijvoorbeeld CTU SQL Project, dus ik zorgde ervoor dat ik mijn script begon met USE [CTU SQL Project] als mijn eerste regel, zoals hieronder.

USE [CTU SQL Project]
SELECT Advisors.First_Name, Advisors.Last_Name...and so on.

Antwoord 9

Als deze fout optreedt in een UPDATE, controleer dan nogmaals de JOINin de tabel met de kolom/het veld dat de fout veroorzaakt.

In mijn geval was dit te wijten aan het ontbreken van de JOINzelf, die dezelfde fout genereerde vanwege een onbekend veld (als Andriy wees erop).


Antwoord 10

In plaats daarvan kun je proberen deel te nemen aan tabellen zoals,

select 
  .... 
from 
   dkcd 
     right join 
                a
                  , b

Dit zou moeten werken


Antwoord 11

SELECT DISTINCT
        phuongxa.maxa ,
        quanhuyen.mahuyen ,
        phuongxa.tenxa ,
        quanhuyen.tenhuyen ,
        ISNULL(dkcd.tong, 0) AS tongdkcd
FROM    phuongxa ,
        quanhuyen
        LEFT OUTER JOIN ( SELECT    khaosat.maxa ,
                                    COUNT(*) AS tong
                          FROM      khaosat
                          WHERE     CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
                                                              AND
                                                              'Sep 5 2011'
                          GROUP BY  khaosat.maxa
                        ) AS dkcd ON dkcd.maxa = maxa
WHERE   phuongxa.maxa <> '99'
        AND LEFT(phuongxa.maxa, 2) = quanhuyen.mahuyen
ORDER BY maxa;

Antwoord 12

Mijn fout was om een ​​veld te gebruiken dat niet in de tabel bestond.

tabel1.veld1 => bestaat niet

tabel2.veld1 => klopt

Corrigeer uw tabelnaam.

mijn fout is opgetreden vanwege het gebruik van WITH

WITH RCTE AS (
   SELECT...
)
SELECT RCTE.Name, ...
FROM 
  RCTE INNER JOIN Customer
  ON RCTE.CustomerID = Customer.ID 

wanneer gebruikt in join met andere tabellen …


Antwoord 13

Ben je vergeten mee te doen aan een aantal tafels? Zo niet, dan moet je waarschijnlijk een aantal aliassen gebruiken.


Antwoord 14

Ik worstelde ook met deze fout en eindigde met dezelfde strategie als het antwoord. Ik voeg mijn antwoord toe om te bevestigen dat dit een strategie is die zou moeten werken.

Hier is een voorbeeld waarbij ik eerst een inner join doe tussen twee tabellen waarvan ik weet dat ze gegevens hebben en vervolgens twee left outer joins op tabellen die corresponderende rijen kunnen hebben die leeg kunnen zijn. U mixt inner joins en outer joins om resultaten te krijgen met gegevens in tabellen in plaats van de standaard door komma’s gescheiden syntaxis tussen tabellen te gebruiken en rijen in uw gewenste join te missen.

use somedatabase
go 
select o.operationid, o.operatingdate, p.pasid, p.name as patientname, o.operationalunitid, f.name as operasjonsprogram,  o.theaterid as stueid, t.name as stuenavn, o.status as operasjonsstatus from operation o 
inner join patient p on o.operationid = p.operationid 
left outer join freshorganizationalunit f on f.freshorganizationalunitid = o.operationalunitid
left outer join theater t on t.theaterid = o.theaterid
where (p.Name like '%Male[0-9]%' or p.Name like '%KFemale [0-9]%')

Eerst: voer de inner joins uit tussen tabellen waarvan u verwacht dat ze overeenkomen met gegevens.
Tweede deel: Ga verder met outer joins om te proberen gegevens in andere tabellen op te halen,
maar dit zal uw resultatenset niet uitfilteren als de buitenste join van de tabel geen overeenkomstige gegevens heeft of niet overeenkomt met de voorwaarde die u instelt in het predikaat on/voorwaarde.


Antwoord 15

Deze fout kan ook worden veroorzaakt door simpelweg een komma ,te missen tussen de kolomnamen in de SELECT-instructie.

bijvoorbeeld:

SELECT MyCol1, MyCol2 MyCol3 FROM SomeTable;

Other episodes