多部分标识符不能被绑定

我已经看到类似的错误,但我没有find解决我的问题。 我有一个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; 

您正在将隐式联接与显式联接进行混合。 这是允许的,但你需要知道如何做到这一点。

事情是,显式连接(使用JOIN关键字实现的连接)优先于隐式连接(“逗号”连接,其中连接条件在WHERE子句中指定)。

以下是您的查询的大纲:

 SELECT … FROM a, b LEFT JOIN dkcd ON … WHERE … 

您可能期望它的行为如下所示:

 SELECT … FROM (a, b) LEFT JOIN dkcd ON … WHERE … 

也就是说,表ab的组合与表dkcd 。 事实上,发生的事情是

 SELECT … FROM a, (b LEFT JOIN dkcd ON …) WHERE … 

也就是说,正如你可能已经理解的那样, dkcd是专门针对b而且仅仅是b ,那么连接的结果与a结合,并且用WHERE子句进一步过滤。 在这种情况下, ON子句中对a任何引用都是无效的,在这一点上a是未知的。 这就是为什么你收到错误信息。

如果我是你,我可能会尝试重写这个查询,一个可能的解决scheme可能是:

 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 

在这里,表ab首先被连接,然后结果被连接到dkcd 。 基本上,这和你的查询是一样的,只是对一个连接使用不同的语法,这就产生了很大的不同: dkcd连接条件中的引用a.maxa现在是绝对有效的。

正如@Aaron Bertrand已经正确地指出的那样,你应该在ORDER BY子句中使用特定的别名(可能a maxa限定maxa

有时候,如果在查询中以错误的方式使用模式(dbo),则会发生此错误。

例如,如果你写:

 select dbo.prd.name from dbo.product prd 

你会得到错误。

在这种情况下将其更改为:

 select prd.name from dbo.product prd 

如果你已经给了糖果名称更改为实际的名称

例如。

 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; 

我不熟悉SQL,但在我学习过程中遇到过这个问题,发现将查询分配给项目特别有助于消除多部分错误。 例如,我创build的项目是CTU SQL Project,所以我确定我开始使用USE [CTU SQL Project]作为我的第一行,如下所示。

 USE [CTU SQL Project] SELECT Advisors.First_Name, Advisors.Last_Name...and so on. 

我在SQL SERVER中遇到了同样的错误信息,因为我有多个连接,改变连接的顺序为我解决了。

如果在UPDATE发生此错误,请使用导致错误的列/字段仔细检查表上的JOIN

在我的情况下,这是由于缺lessJOIN本身,由于未知的字段而产生相同的错误(正如Andriy指出的那样 )。

 SELECT DISTINCT phuongxa.maxa , quanhuyen.mahuyen , phuongxa.tenxa , quanhuyen.tenhuyen , ISNULL(dkcd.tong, 0) AS tongdkcd FROM phuongxa , quanhuyen LEFT OUTER JOIN ( SELECT khaosat.maxa , COUNT(*) AS tong FROM khaosat WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011' GROUP BY khaosat.maxa ) AS dkcd ON dkcd.maxa = maxa WHERE phuongxa.maxa <> '99' AND LEFT(phuongxa.maxa, 2) = quanhuyen.mahuyen ORDER BY maxa; 

我的错误是使用表中不存在的字段。

table1.field1 =>不存在

table2.field1 =>是正确的

纠正你的表名。

我的错误发生是因为使用了WITH

 WITH RCTE AS ( SELECT... ) SELECT RCTE.Name, ... FROM RCTE INNER JOIN Customer ON RCTE.CustomerID = Customer.ID 

当用于与其他表join…

相反,你可以尝试连接表,

 select .... from dkcd right join a , b 

这应该工作