为了账号安全,请及时绑定邮箱和手机立即绑定

无法绑定多部分标识符

无法绑定多部分标识符

守候你守候我 2019-08-02 14:35:24
无法绑定多部分标识符我在SO上看到过类似的错误,但我找不到解决问题的方法。我有一个SQL查询,如:SELECT DISTINCT         a.maxa ,         b.mahuyen ,         a.tenxa ,         b.tenhuyen ,         ISNULL(dkcd.tong, 0) AS tongdkcdFROM    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.maxaWHERE   a.maxa <> '99'         AND LEFT(a.maxa, 2) = b.mahuyenORDER BY maxa;当我执行此查询时,错误结果为: 无法绑定多部分标识符“a.maxa”。为什么? P / s:如果我将查询分成2个单独的查询,它运行正常。SELECT DISTINCT         a.maxa ,         b.mahuyen ,         a.tenxa ,         b.tenhuyenFROM    phuongxa a ,         quanhuyen bWHERE   a.maxa <> '99'         AND LEFT(a.maxa, 2) = b.mahuyenORDER BY maxa;和SELECT  maxa ,         COUNT(*) AS tongFROM    khaosatWHERE   CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'                                         AND     'Sep 5 2011'GROUP BY maxa;
查看完整描述

3 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

您正在将隐式连接与显式连接混合使用。这是允许的,但你需要知道如何正确地做到这一点。

问题是,显式连接(使用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子句进一步结合并进一步过滤。在这种情况下,a对该ON子句中的任何引用都是无效的,此时a是未知的。这就是您收到错误消息的原因。

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

SELECT DISTINCT
  a.maxa,
  b.mahuyen,
  a.tenxa,
  b.tenhuyen,
  ISNULL(dkcd.tong, 0) AS tongdkcdFROM 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.maxaWHERE a.maxa <> '99'ORDER BY a.maxa

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


查看完整回答
反对 回复 2019-08-02
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

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

例如,如果你写:

select dbo.prd.namefrom dbo.product prd

你会得到错误。

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

select prd.namefrom dbo.product prd


查看完整回答
反对 回复 2019-08-02
  • 3 回答
  • 0 关注
  • 644 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信