无法绑定多部分标识符。

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

我也看到过类似的错误,但我找不到解决问题的办法。我有一个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(A)条)。

下面是查询大纲:

SELEC
  …
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条款。在这种情况下,任何引用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现在的联接条件是绝对有效的。

@aronbertrand正确地指出,您应该有资格maxa有一个特定的别名,可能a,在ORDER BY条款。

不懂老师小白回答于

有时,当以错误的方式在查询中使用架构(DBO)时,会发生此错误。

例如,如果写:

select dbo.prd.name
from dbo.product prd

你会得到错误的。

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

select prd.name
from dbo.product prd

扫码关注云+社区