it-swarm.com.de

Die mehrteilige Kennung konnte nicht gebunden werden

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;
162
PhamMinh

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.

188
Andriy M

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
34
Bobs

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.

7
Pavel M.

In meinem Fall war das Problem der Aliasname, den ich der Tabelle gegeben hatte. "oa" scheint für SQL Server nicht akzeptabel zu sein.

2
Hashim Akhtar

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 ).

1
CPHPython

Hast du vergessen, an einigen Tischen teilzunehmen? Wenn nicht, müssen Sie wahrscheinlich einige Aliase verwenden.

1
JedatKinports
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;
1
SVaidya

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.
1
Bogartz

Stattdessen können Sie versuchen, Tabellen wie

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

Das sollte funktionieren

1
Suman Kumar

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 ...

1
Zolfaghari

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

1
xbmono

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)
0
SauerTrout

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.

0
Tore Aurstad