Ik heb soortgelijke fouten gezien, 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;
Wanneer ik deze query uitvoer, is het foutresultaat:
The Multi-Part Identifier “A.Maxa” kan niet gebonden zijn. Waarom?
P / S: Als ik de query verdeel in 2 individuele query, loopt het 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;
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 a
en b
wordt 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 dkcd
specifiek samengevoegd tegen b
en alleen b
, dan is het resultaat van de samenvoeging wordt gecombineerd met a
en verder gefilterd met de WHERE
-clausule. In dit geval is elke verwijzing naar a
in de ON
-clausule ongeldig, a
is 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 a
en b
samengevoegd, 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.maxa
in de dkcd
‘ s deelnamevoorwaarde is nu absoluut geldig.
Zoals @Aaron Bertrand terecht heeft opgemerkt, moet u waarschijnlijk maxa
kwalificeren 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 in mijn geval niet. 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 JOIN
in de tabel met de kolom/het veld dat de fout veroorzaakt.
In mijn geval was dit te wijten aan het ontbreken van de JOIN
zelf, 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
Bij gebruik in Join met andere tabellen …
Antwoord 13
Vergeet u zich bij sommige tafels? Zo niet, dan moet u waarschijnlijk enkele aliassen gebruiken.
Antwoord 14
Ik worstel ook met deze fout en eindigde met dezelfde strategie als het antwoord. Ik ben inclusief mijn antwoord om te bevestigen dat dit een strategie is die zou moeten werken.
Hier is een voorbeeld waar ik eerst een innerlijke join tussen twee tafels doe, ik ken gegevens en vervolgens twee linker buitenste joins op tabellen die de bijbehorende rijen kunnen hebben die leeg kunnen zijn. Je mixt innerlijke joins en buitenste joins om resultaten te krijgen met data-accounttafels in plaats van de standaardcomma-syntaxis tussen tabellen te doen en rijen te missen in de rijen.
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]%')
Ten eerste: doe de innerlijke joins tussen tabellen die u verwacht dat gegevensvergelijking.
Tweede onderdeel: Ga door met de buitenste joins om te proberen gegevens in andere tabellen op te halen,
Maar dit zal uw resultaat-instellen niet filteren als de buitendoestel van de tabel geen corresponderende gegevens heeft of overeenkomt met de voorwaarde die u in het op predikaat / toestand hebt ingesteld.
Antwoord 15
Deze fout kan ook worden veroorzaakt door eenvoudigweg een komma ,
tussen de kolomnamen in de geselecteerde verklaring te missen.
bijvoorbeeld:
SELECT MyCol1, MyCol2 MyCol3 FROM SomeTable;