无法绑定多部分标识符我在SO上看到过类似的错误,但我找不到解决问题的方法。我有一个SQL查询,如:SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyen ,
ISNULL(dkcd.tong, 0) AS tongdkcdFROM 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.maxaWHERE a.maxa <> '99'
AND LEFT(a.maxa, 2) = b.mahuyenORDER BY maxa;当我执行此查询时,错误结果为: 无法绑定多部分标识符“a.maxa”。为什么? P / s:如果我将查询分成2个单独的查询,它运行正常。SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyenFROM phuongxa a ,
quanhuyen bWHERE a.maxa <> '99'
AND LEFT(a.maxa, 2) = b.mahuyenORDER BY maxa;和SELECT maxa ,
COUNT(*) AS tongFROM khaosatWHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
AND 'Sep 5 2011'GROUP BY maxa;
3 回答
慕桂英3389331
TA贡献2036条经验 获得超8个赞
您正在将隐式连接与显式连接混合使用。这是允许的,但你需要知道如何正确地做到这一点。
问题是,显式连接(使用JOIN
关键字实现的连接)优先于隐式连接('逗号'连接,其中连接条件在WHERE
子句中指定)。
以下是您的查询大纲:
SELECT …FROM a, b LEFT JOIN dkcd ON …WHERE …
您可能希望它的行为如下:
SELECT …FROM (a, b) LEFT JOIN dkcd ON …WHERE …
即,表的组合a
和b
接合用表dkcd
。事实上,正在发生的事情是
SELECT …FROM a, (b LEFT JOIN dkcd ON …)WHERE …
也就是说,正如您可能已经理解的那样,只有dkcd
特定的反对b
和联接b
,然后结合的结果a
与该WHERE
子句进一步结合并进一步过滤。在这种情况下,a
对该ON
子句中的任何引用都是无效的,此时a
是未知的。这就是您收到错误消息的原因。
如果我是你,我可能会尝试重写这个查询,一个可能的解决方案可能是:
SELECT DISTINCT a.maxa, b.mahuyen, a.tenxa, b.tenhuyen, ISNULL(dkcd.tong, 0) AS tongdkcdFROM 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.maxaWHERE a.maxa <> '99'ORDER BY a.maxa
这里的表格a
,并b
首先连接,然后将结果接合dkcd
。基本上,这是相同的查询是你的,只是使用不同的语法的连接,这使得有很大的差别之一:参考a.maxa
中dkcd
的连接条件是现在绝对有效。
慕婉清6462132
TA贡献1804条经验 获得超2个赞
有时,当您以错误的方式在查询中使用架构(dbo)时会发生此错误。
例如,如果你写:
select dbo.prd.namefrom dbo.product prd
你会得到错误。
在这种情况下,将其更改为:
select prd.namefrom dbo.product prd
添加回答
举报
0/150
提交
取消