Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Die mehrteilige Kennung konnte nicht gebunden werden

Sie mischen implizite Joins mit expliziten Joins. Das ist erlaubt, aber man muss wissen, wie man das richtig macht.

Die Sache ist die, explizite Joins (diejenigen, die mit JOIN implementiert werden Schlüsselwort) haben Vorrang vor impliziten (die Komma-Joins, bei denen die Join-Bedingung im WHERE angegeben ist Klausel).

Hier ist eine Zusammenfassung Ihrer 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 …

das heißt, die Kombination der Tabellen a und b wird mit der Tabelle dkcd verknüpft . Tatsächlich passiert Folgendes:

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

das heißt, wie Sie vielleicht schon verstanden haben, dkcd wird speziell gegen b verknüpft und nur b , dann wird das Ergebnis des Joins mit a kombiniert und mit dem WHERE weiter gefiltert Klausel. In diesem Fall jeder Verweis auf a im ON Klausel ist ungültig, a ist 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 wäre:

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 die Tabellen a und b werden zuerst verknüpft, dann wird das Ergebnis mit dkcd verknüpft . Im Grunde ist dies die gleiche Abfrage wie Ihre, nur mit einer anderen Syntax für einen der Joins, was einen großen Unterschied macht:die Referenz a.maxa im dkcd Die Join-Bedingung von ist jetzt absolut gültig.

Wie @Aaron Bertrand richtig bemerkt hat, sollten Sie wahrscheinlich maxa qualifizieren mit einem bestimmten Alias, wahrscheinlich a , im Feld ORDER BY Klausel.