Fehler und Lösungen bei mehrteiligen SQL-Identifikatoren
Beim Abrufen und Bearbeiten von Datenbankdaten mithilfe von SQL-Abfragen tritt häufig der Fehler „Mehrteiliger Bezeichner kann nicht gebunden werden“ auf, was frustrierend ist. In diesem Artikel werden dieser Fehler und seine Lösungen erläutert, um Ihnen bei der zukünftigen Behebung ähnlicher Probleme zu helfen.
Fehler verstehen
Der Fehler „Mehrteiliger Bezeichner kann nicht gebunden werden“ tritt normalerweise auf, wenn ein mehrteiliger Bezeichner (bestehend aus einem Tabellenalias und einem Spaltennamen) in einer Abfrage verwendet, aber nicht korrekt in Anführungszeichen gesetzt wird. Diese Situation tritt auf, wenn Sie implizite Joins (mit Kommas in der FROM-Klausel) und explizite Joins (mit dem Schlüsselwort JOIN) in derselben Abfrage mischen.
Gemischte Verwendung von Verknüpfungen
Implizite Joins sind weniger explizit als explizite Joins und werden häufig zur Vereinfachung von Abfragen verwendet. Allerdings haben explizite Joins Vorrang vor impliziten Joins. Das heißt, wenn Sie explizite und implizite Joins in einer Abfrage mischen, haben die expliziten Join-Bedingungen Vorrang und überschreiben möglicherweise die impliziten Join-Bedingungen.
Beispielabfrage
Sehen wir uns die Beispielabfrage in der Frage an:
<code class="language-sql">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;</code>
In dieser Abfrage hat eine explizite Verknüpfung zwischen „b“ und „dkcd“ unter Verwendung der ON-Klausel Vorrang vor einer impliziten Verknüpfung zwischen „a“ und „dkcd“. Dies führt dazu, dass der Verweis auf „a.maxa“ in der ON-Klausel ungültig ist, da „a“ zu diesem Zeitpunkt noch nicht mit „dkcd“ verbunden ist.
Lösung: Schreiben Sie die Abfrage neu
Um diesen Fehler zu beheben, schreiben Sie die Abfrage neu, um explizite Verknüpfungen für alle Tabellenbeziehungen zu verwenden:
<code class="language-sql">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;</code>
In dieser neu geschriebenen Abfrage wird die Tabelle „a“ mithilfe eines expliziten INNER JOIN mit „b“ verknüpft. Die Ergebnisse dieses Joins werden dann mit „dkcd“ unter Verwendung eines expliziten LEFT OUTER JOIN verknüpft. Dadurch wird sichergestellt, dass der Verweis auf „a.maxa“ in der Join-Bedingung von dkcd gültig ist.
Zusätzliche Hinweise
Es ist erwähnenswert, dass es in der ORDER BY-Klausel besser ist, die Spalte „maxa“ mit einem Tabellenalias zu qualifizieren, da dies Mehrdeutigkeiten und mögliche Fehler verhindert (wenn die Abfrage mehrere Spalten mit demselben Namen enthält). In diesem Beispiel wäre die ORDER BY-Klausel:
<code class="language-sql">ORDER BY a.maxa</code>
Das obige ist der detaillierte Inhalt vonWarum erhalte ich in meiner SQL-Abfrage den Fehler „Der mehrteilige Bezeichner konnte nicht gebunden werden' und wie kann ich ihn beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!