首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法绑定多部分标识符

无法绑定多部分标识符
EN

Stack Overflow用户
提问于 2011-09-06 09:29:41
回答 17查看 947.6K关注 0票数 223

我在SO上看到过类似的错误,但我没有找到解决问题的方法。我有一个SQL查询,如:

代码语言:javascript
复制
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:如果我将查询分成两个单独的查询,它运行正常。

代码语言:javascript
复制
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;

代码语言:javascript
复制
SELECT  maxa ,
        COUNT(*) AS tong
FROM    khaosat
WHERE   CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
                                        AND     'Sep 5 2011'
GROUP BY maxa;
EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2011-09-06 12:28:23

您混合了隐式联接和显式联接。这是允许的,但您需要知道如何正确地执行此操作。

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

下面是您的查询的概要:

代码语言:javascript
复制
SELECT
  …
FROM a, b LEFT JOIN dkcd ON …
WHERE …

您可能希望它的行为是这样的:

代码语言:javascript
复制
SELECT
  …
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …

也就是说,表ab的组合与表dkcd连接。实际上,正在发生的事情是

代码语言:javascript
复制
SELECT
  …
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …

也就是说,正如您可能已经理解的那样,dkcd是专门针对b且仅针对b进行联接的,然后联接的结果将与a组合,并使用WHERE子句进一步过滤。在这种情况下,ON子句中对a的任何引用都是无效的,此时a是未知的。这就是您收到错误消息的原因。

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

代码语言:javascript
复制
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子句中使用特定的别名来限定maxa,可能是a

票数 257
EN

Stack Overflow用户

发布于 2014-10-20 14:55:48

有时,当您在查询中以错误的方式使用架构(dbo)时,就会出现此错误。

例如,如果你这样写:

代码语言:javascript
复制
select dbo.prd.name
from dbo.product prd

您将得到错误。

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

代码语言:javascript
复制
select prd.name
from dbo.product prd
票数 47
EN

Stack Overflow用户

发布于 2016-12-05 09:04:40

如果您已指定alies名称,请将其更改为实际名称

例如

代码语言:javascript
复制
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;

将其更改为

代码语言:javascript
复制
SELECT  
    A.name,A.date
  FROM [LoginInfo].[dbo].[TableA] as A
   join 
  [LoginInfo].[dbo].[TableA] as B 
  on  A.name=B.name;
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7314134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档