Ich habe ähnliche Fehler bei SO gesehen, aber ich finde keine Lösung für mein Problem. 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:
Die mehrteilige Kennung "a.maxa" konnte nicht gebunden werden. Warum?
P / s: Wenn ich die Abfrage in 2 einzelne Abfragen teile, läuft sie in Ordnung.
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;
sql
sql-server
sql-server-2005
PhamMinh
quelle
quelle
phuongxa
Tabelle eine Spaltemaxa
?Antworten:
Sie mischen implizite Verknüpfungen mit expliziten Verknüpfungen. Das ist erlaubt, aber Sie müssen wissen, wie man das richtig macht.
Die Sache ist, dass explizite Verknüpfungen (diejenigen, die mit dem
JOIN
Schlüsselwort implementiert werden ) Vorrang vor impliziten Verknüpfungen haben (die 'Komma'-Verknüpfungen, bei denen die Verknüpfungsbedingung in derWHERE
Klausel angegeben ist).Hier ist ein Überblick über Ihre Anfrage:
Sie erwarten wahrscheinlich, dass es sich so verhält:
das heißt, die Kombination von Tabellen
a
undb
wird mit der Tabelle verbundendkcd
. In der Tat ist was passiertDas heißt, wie Sie vielleicht bereits verstanden haben,
dkcd
wird spezifisch gegenb
und nurb
dann verbunden, dann wird das Ergebnis des Joinsa
mit derWHERE
Klausel kombiniert und weiter gefiltert . In diesem Fall ist ein Verweisa
in derON
Klausel ungültig unda
zu diesem Zeitpunkt 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:
Hier werden zuerst die Tabellen
a
undb
zusammengefügt, dann wird das Ergebnis mit verbundendkcd
. Grundsätzlich ist dies dieselbe Abfrage wie bei Ihnen, wobei nur eine andere Syntax für einen der Joins verwendet wird. Dies macht einen großen Unterschied: Die Referenza.maxa
in derdkcd
Join-Bedingung des Joins ist jetzt absolut gültig.Wie @Aaron Bertrand richtig bemerkt hat, sollten Sie sich wahrscheinlich
maxa
mit einem bestimmten Alias qualifizieren, wahrscheinlicha
in derORDER BY
Klausel.quelle
ORDER BY maxa
, danke. Ich glaube, die OP hat die Daten so ausgewählt, um sie in ihrer Umgebung anzugeben.Manchmal tritt dieser Fehler auf, wenn Sie Ihr Schema (dbo) in Ihrer Abfrage falsch verwenden.
Zum Beispiel, wenn Sie schreiben:
Sie erhalten den Fehler.
In diesen Situationen ändern Sie es zu:
quelle
Wenn Sie Alies einen Namen gegeben haben, ändern Sie diesen in den tatsächlichen Namen
beispielsweise
ändere das auf
quelle
Ich hatte Probleme mit der gleichen Fehlermeldung in SQL SERVER, da ich mehrere Joins hatte. Durch Ändern der Reihenfolge der Joins wurde dies für mich behoben.
quelle
In meinem Fall stellte sich heraus, dass es sich um den Aliasnamen handelte, den ich der Tabelle gegeben hatte. "oa" scheint für SQL Server nicht akzeptabel zu sein.
quelle
Ich hatte den gleichen Fehler von JDBC. Überprüfte alles und meine Anfrage war in Ordnung. Es stellte sich heraus, in wo Klausel ich ein Argument habe:
Und der Wert des von mir übergebenen Arguments war null. Dies führt auch zu dem gleichen Fehler, der irreführend ist, da Sie beim Durchsuchen des Internets feststellen, dass etwas mit der Abfragestruktur nicht stimmt, aber in meinem Fall nicht. Ich dachte nur, jemand könnte das gleiche Problem haben
quelle
Für mich hat es funktioniert, meine WHERE-Klausel in eine SELECT-Unterabfrage zu ändern
VON:
ZU:
quelle
Ich bin neu in SQL, bin jedoch in einem Kurs auf dieses Problem gestoßen und habe festgestellt, dass das Zuweisen der Abfrage zum Projekt speziell dazu beigetragen hat, den mehrteiligen Fehler zu beseitigen. Das von mir erstellte Projekt war beispielsweise CTU SQL Project. Daher habe ich sichergestellt, dass ich mein Skript mit USE [CTU SQL Project] als erste Zeile wie unten gestartet habe.
quelle
Wenn dieser Fehler in einem
UPDATE
auftritt, überprüfen Sie dieJOIN
Tabelle mit der Spalte / dem Feld, die den Fehler verursacht.In meinem Fall war dies auf das Fehlen des
JOIN
Selbst zurückzuführen, das aufgrund eines unbekannten Feldes denselben Fehler erzeugte (wie Andriy betonte ).quelle
Stattdessen können Sie versuchen, Tabellen wie:
Das sollte funktionieren
quelle
quelle
Mein Fehler war, 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 aufgrund der Verwendung von WITH aufgetreten
bei Verwendung in Verbindung mit anderen Tabellen ...
quelle
Haben Sie vergessen, einige Tische zu verbinden? Wenn nicht, müssen Sie wahrscheinlich einige Aliase verwenden.
quelle
Ich hatte auch mit diesem Fehler zu kämpfen und hatte die gleiche Strategie wie die Antwort. Ich füge meine Antwort hinzu, um zu bestätigen, dass dies eine Strategie ist, die funktionieren sollte.
Hier ist ein Beispiel, in dem ich zuerst einen inneren Join zwischen zwei Tabellen mache, von denen ich weiß, dass sie Daten haben, und dann zwei linke äußere Joins für Tabellen, die möglicherweise entsprechende Zeilen haben, die leer sein können. Sie mischen innere Verknüpfungen und äußere Verknüpfungen, um Ergebnisse mit Daten über Tabellen hinweg zu erhalten, anstatt die durch Kommas getrennte Standardsyntax zwischen Tabellen auszuführen und Zeilen in der gewünschten Verknüpfung zu verpassen.
Erstens: Führen Sie die inneren Verknüpfungen zwischen Tabellen durch, für die eine Datenübereinstimmung erwartet wird. Zweiter Teil: Fahren Sie mit den äußeren Verknüpfungen fort, um zu versuchen, Daten in anderen Tabellen abzurufen. Dies filtert jedoch nicht Ihre Ergebnismenge heraus, wenn die äußere Verknüpfung der Tabelle zu keine entsprechenden Daten enthält oder mit der Bedingung übereinstimmt, die Sie im Prädikat / der Bedingung on eingerichtet haben.
quelle
Dieser Fehler kann auch durch einfaches Fehlen eines Kommas verursacht werden
,
zwischen den Spaltennamen in der SELECT-Anweisung .z.B:
quelle