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中文网其他相关文章!