Ich habe ähnliche Fehler in SO gesehen, aber ich kann keine Lösung für mein Problem finden ... Ich habe eine SQL-Abfrage wie:
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;
Wenn ich diese Abfrage ausführe, lautet das Fehlerergebnis: Der mehrteilige Bezeichner "a.maxa" konnte nicht gebunden werden. Warum?
P/s: Wenn ich die Abfrage in 2 Einzelabfragen teile, läuft sie 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;
und
SELECT maxa ,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
AND 'Sep 5 2011'
GROUP BY maxa;
Sie mischen implizite Joins mit expliziten Joins. Das ist erlaubt, aber Sie müssen wissen, wie man das richtig macht.
Die Sache ist, explizite Joins (diejenigen, die mit dem Schlüsselwort JOIN
implementiert werden) haben Vorrang vor impliziten Joins (die 'Komma'-Joins, bei denen die Join-Bedingung in der WHERE
-Klausel angegeben ist).
Hier ist ein Überblick über Ihre Anfrage:
SELECT
…
FROM a, b LEFT JOIN dkcd ON …
WHERE …
Sie erwarten wahrscheinlich, dass es sich so verhält:
SELECT
…
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …
dh die Kombination der Tabellen a
und b
wird mit der Tabelle dkcd
verbunden. Tatsächlich ist das, was passiert
SELECT
…
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …
das heißt, wie Sie vielleicht bereits verstanden haben, dass dkcd
speziell gegen b
und nur b
verbunden ist, wird das Ergebnis des Joins mit a
kombiniert und mit der WHERE
-Klausel weiter gefiltert. In diesem Fall ist jeder Verweis auf a
in der ON
-Klausel ungültig, a
ist an dieser Stelle unbekannt. Deshalb erhalten Sie die Fehlermeldung.
Wenn ich Sie wäre, würde ich wahrscheinlich versuchen, diese Abfrage neu zu schreiben, und eine mögliche Lösung könnte sein:
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 werden zuerst die Tabellen a
und b
verbunden, dann wird das Ergebnis mit dkcd
verknüpft. Im Grunde ist dies die gleiche Abfrage wie die Ihre, wobei nur eine andere Syntax für einen der Joins verwendet wird, was einen großen Unterschied macht: Der Verweis a.maxa
in der Join-Bedingung von dkcd
ist jetzt absolut gültig.
Wie @Aaron Bertrand richtig bemerkt hat, sollten Sie maxa
wahrscheinlich mit einem bestimmten Alias, wahrscheinlich a
, in der ORDER BY
-Klausel qualifizieren.
Dieser Fehler tritt manchmal auf, wenn Sie Ihr Schema (Dbo) falsch in Ihrer Abfrage verwenden.
zum Beispiel, wenn Sie schreiben:
select dbo.prd.name
from dbo.product prd
sie erhalten den Fehler.
Ändern Sie in diesen Situationen Folgendes:
select prd.name
from dbo.product prd
wenn Sie den Namen eines Verbündeten angegeben haben, ändern Sie diesen in den tatsächlichen Namen
zum Beispiel
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;
ändere das zu
SELECT
A.name,A.date
FROM [LoginInfo].[dbo].[TableA] as A
join
[LoginInfo].[dbo].[TableA] as B
on A.name=B.name;
Ich hatte mit der gleichen Fehlermeldung in SQL SERVER zu kämpfen, da ich mehrere Joins hatte und die Reihenfolge der Joins änderte für mich gelöst.
In meinem Fall war das Problem der Aliasname, den ich der Tabelle gegeben hatte. "oa" scheint für SQL Server nicht akzeptabel zu sein.
Wenn dieser Fehler in einer UPDATE
auftritt, überprüfen Sie die JOIN
in der Tabelle mit der Spalte/dem Feld, das den Fehler verursacht, erneut.
In meinem Fall war dies auf das Fehlen der JOIN
selbst zurückzuführen, die den gleichen Fehler aufgrund eines unbekannten Feldes verursachte (wie Andriy darauf hingewiesen ).
Hast du vergessen, an einigen Tischen teilzunehmen? Wenn nicht, müssen Sie wahrscheinlich einige Aliase verwenden.
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;
Ich bin neu in SQL, habe dieses Problem jedoch in einem Kurs entdeckt, den ich gerade besuchte, und fand heraus, dass die Zuweisung der Abfrage an das Projekt speziell dazu beigetragen hat, den mehrteiligen Fehler zu beseitigen. Zum Beispiel war das Projekt, das ich erstellt hatte, ein CTU-SQL-Projekt. Daher stellte ich sicher, dass ich mein Skript mit USE [CTU SQL-Projekt] als erste Zeile wie unten gestartet begann.
USE [CTU SQL Project]
SELECT Advisors.First_Name, Advisors.Last_Name...and so on.
Stattdessen können Sie versuchen, Tabellen wie
select
....
from
dkcd
right join
a
, b
Das sollte funktionieren
Mein Fehler bestand darin, ein Feld zu verwenden, das in der Tabelle nicht vorhanden war.
table1.field1 => ist nicht vorhanden
table2.field1 => ist korrekt
Korrigieren Sie Ihren Tabellennamen.
mein Fehler ist aufgetreten, weil WITH verwendet wurde
WITH RCTE AS (
SELECT...
)
SELECT RCTE.Name, ...
FROM
RCTE INNER JOIN Customer
ON RCTE.CustomerID = Customer.ID
bei Verwendung in Verbindung mit anderen Tabellen ...
Ich hatte den gleichen Fehler von JDBC. Alles geprüft und meine Abfrage war in Ordnung. Es stellte sich heraus, in welcher Klausel ich ein Argument habe:
where s.some_column = ?
Der Wert des Arguments, das ich vorlegte, war null. Dies führt auch zu dem gleichen Fehler, der irreführend ist, da bei der Suche im Internet die Abfragestruktur nicht stimmt, in meinem Fall jedoch nicht. Nur gedacht, jemand könnte das gleiche Problem haben
Was für mich funktionierte, war, meine WHERE-Klausel in eine SELECT-Unterabfrage zu ändern
VON:
DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = [dbo].FetchedTagTransferData.IssueId
ZU:
DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = (SELECT NoteId FROM FetchedTagTransferData)
Ich hatte auch mit diesem Fehler zu kämpfen und endete mit der gleichen Strategie wie die Antwort. Ich füge meine Antwort nur hinzu, um zu bestätigen, dass dies eine Strategie ist, die funktionieren sollte.
Hier ist ein Beispiel, bei dem ich zuerst eine innere Verknüpfung zwischen zwei Tabellen, die ich kenne, und dann zwei linke äußere Verknüpfungen in Tabellen, die entsprechende Zeilen enthalten könnten, mache, die leer sein können. Sie mischen innere Joins und äußere Joins, um Ergebnisse mit Data-Accross-Tabellen zu erhalten, anstatt die durch Kommas getrennte Standard-Syntax zwischen Tabellen zu verwenden und Zeilen in Ihrem gewünschten Join auszulassen.
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]%')
Erstens: Führen Sie die inneren Verknüpfungen zwischen Tabellen durch, von denen Sie erwarten, dass sie Daten abgleichen. Zweiter Teil: Fahren Sie mit äußeren Verknüpfungen fort, um zu versuchen, Daten in anderen Tabellen abzurufen, Die Ergebnismenge wird jedoch nicht herausgefiltert, wenn das äußere Verbinden von Tabellen nicht mit entsprechenden Daten oder Übereinstimmungen mit der von Ihnen festgelegten Bedingung übereinstimmt das on Prädikat/Bedingung.