多部分标识符不能被绑定
我已经看到类似的错误,但我没有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 …
也就是说,表a
和b
的组合与表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
在这里,表a
和b
首先被连接,然后结果被连接到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
这应该工作