我在SO上看到过类似的错误,但我没有找到解决问题的方法。我有一个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;
当我执行这个查询时,错误结果是:无法绑定由多个部分组成的标识符"a.maxa“。为什么?
P/s:如果我将查询分成两个单独的查询,它运行正常。
SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyen
FROM phuongxa a ,
quanhuyen b
WHERE a.maxa <> '99'
AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;
和
SELECT maxa ,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
AND 'Sep 5 2011'
GROUP BY maxa;
发布于 2011-09-06 12:28:23
您混合了隐式联接和显式联接。这是允许的,但您需要知道如何正确地执行此操作。
问题是,显式连接(使用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
子句进一步过滤。在这种情况下,ON
子句中对a
的任何引用都是无效的,此时a
是未知的。这就是您收到错误消息的原因。
如果我是你,我可能会尝试重写这个查询,一个可能的解决方案可能是:
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
在这里,首先连接表a
和b
,然后将结果连接到dkcd
。基本上,这是与您的查询相同的查询,只是对其中一个连接使用了不同的语法,这产生了很大的不同:dkcd
的连接条件中的引用a.maxa
现在绝对有效。
正如@Aaron Bertrand正确指出的那样,您可能应该在ORDER BY
子句中使用特定的别名来限定maxa
,可能是a
。
发布于 2014-10-20 14:55:48
有时,当您在查询中以错误的方式使用架构(dbo)时,就会出现此错误。
例如,如果你这样写:
select dbo.prd.name
from dbo.product prd
您将得到错误。
在这种情况下,请将其更改为:
select prd.name
from dbo.product prd
发布于 2016-12-05 09:04:40
如果您已指定alies名称,请将其更改为实际名称
例如
SELECT
A.name,A.date
FROM [LoginInfo].[dbo].[TableA] as A
join
[LoginInfo].[dbo].[TableA] as B
on [LoginInfo].[dbo].[TableA].name=[LoginInfo].[dbo].[TableB].name;
将其更改为
SELECT
A.name,A.date
FROM [LoginInfo].[dbo].[TableA] as A
join
[LoginInfo].[dbo].[TableA] as B
on A.name=B.name;
https://stackoverflow.com/questions/7314134
复制相似问题