SQL 查詢錯誤:「無法綁定多部分識別碼」
問題描述
執行 SQL 查詢時,遇到錯誤:「無法綁定多部分標識符 'a.maxa'」。即使將查詢分成單獨的子查詢,錯誤仍然存在。
以下是一個出錯的查詢範例:
<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>
錯誤原因
此錯誤是由於查詢中明確連接和隱式連接混合使用不當造成的。明確連線以 JOIN 關鍵字表示,優先於隱式連線(使用逗號和 WHERE 子句指定)。
在給定的查詢中,您明確地連接表 a 和 b,然後使用 LEFT OUTER JOIN 語法隱式地將 dkcd 連接到該連接的結果。但是,這導致在 ON 子句中對 a.maxa 的引用無效,因為 a 不是 dkcd 明確連接的一部分。
解
為了解決這個問題,請考慮重寫查詢以使用一致的連接語法。一個可能的解決方案是:
<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>
在這個修改後的查詢中,明確連接被清楚地定義,並且 a.maxa 的引用在 ON 條件中是有效的。正如 Aaron Bertrand 所建議的,您還應該在 ORDER BY 子句中指定 a 別名,以避免任何潛在的歧義。
以上是為什麼我的 SQL 查詢會導致「無法綁定多部分標識符」錯誤,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!