多部分标识符不能被绑定

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

我已经看到类似的错误,但我没有找到解决我的问题。我有一个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:如果我将查询分成2个单独的查询,它运行正常。

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 …

也就是说,正如你可能已经理解的那样,dkcdb只是专门加入并且只加入b,然后结合的结果a与该WHERE子句进一步结合并被进一步过滤。在这种情况下,aON条款中的任何引用都是无效的,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

这里的表格ab首先被连接,然后结果被连接到dkcd。基本上,这是相同的查询是你的,只是使用不同的语法的连接,这使得有很大的差别之一:参考a.maxadkcd的连接条件是现在绝对有效。

用户回答回答于

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

例如,如果你写:

select dbo.prd.name
from dbo.product prd

你会得到错误。

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

select prd.name
from dbo.product prd

扫码关注云+社区