无法绑定多部分标识符

无法绑定多部分标识符

我在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;


守候你守候我
浏览 645回答 3
3回答

慕桂英3389331

您正在将隐式连接与显式连接混合使用。这是允许的,但你需要知道如何正确地做到这一点。问题是,显式连接(使用JOIN关键字实现的连接)优先于隐式连接('逗号'连接,其中连接条件在WHERE子句中指定)。以下是您的查询大纲:SELECT &nbsp;&nbsp;…FROM&nbsp;a,&nbsp;b&nbsp;LEFT&nbsp;JOIN&nbsp;dkcd&nbsp;ON&nbsp;…WHERE&nbsp;…您可能希望它的行为如下:SELECT &nbsp;&nbsp;…FROM&nbsp;(a,&nbsp;b)&nbsp;LEFT&nbsp;JOIN&nbsp;dkcd&nbsp;ON&nbsp;…WHERE&nbsp;…即,表的组合a和b接合用表dkcd。事实上,正在发生的事情是SELECT &nbsp;&nbsp;…FROM&nbsp;a,&nbsp;(b&nbsp;LEFT&nbsp;JOIN&nbsp;dkcd&nbsp;ON&nbsp;…)WHERE&nbsp;…也就是说,正如您可能已经理解的那样,只有dkcd特定的反对b和联接b,然后结合的结果a与该WHERE子句进一步结合并进一步过滤。在这种情况下,a对该ON子句中的任何引用都是无效的,此时a是未知的。这就是您收到错误消息的原因。如果我是你,我可能会尝试重写这个查询,一个可能的解决方案可能是:SELECT&nbsp;DISTINCT &nbsp;&nbsp;a.maxa, &nbsp;&nbsp;b.mahuyen, &nbsp;&nbsp;a.tenxa, &nbsp;&nbsp;b.tenhuyen, &nbsp;&nbsp;ISNULL(dkcd.tong,&nbsp;0)&nbsp;AS&nbsp;tongdkcdFROM&nbsp;phuongxa&nbsp;a&nbsp;&nbsp;INNER&nbsp;JOIN&nbsp;quanhuyen&nbsp;b&nbsp;ON&nbsp;LEFT(a.maxa,&nbsp;2)&nbsp;=&nbsp;b.mahuyen&nbsp;&nbsp;LEFT&nbsp;OUTER&nbsp;JOIN&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;SELECT &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxa, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNT(*)&nbsp;AS&nbsp;tong&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;khaosat&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;CONVERT(datetime,&nbsp;ngaylap,&nbsp;103)&nbsp;BETWEEN&nbsp;'Sep&nbsp;1&nbsp;2011'&nbsp;AND&nbsp;'Sep&nbsp;5&nbsp;2011' &nbsp;&nbsp;&nbsp;&nbsp;GROUP&nbsp;BY&nbsp;maxa&nbsp;&nbsp;)&nbsp;AS&nbsp;dkcd&nbsp;ON&nbsp;dkcd.maxa&nbsp;=&nbsp;a.maxaWHERE&nbsp;a.maxa&nbsp;<>&nbsp;'99'ORDER&nbsp;BY&nbsp;a.maxa这里的表格a,并b首先连接,然后将结果接合dkcd。基本上,这是相同的查询是你的,只是使用不同的语法的连接,这使得有很大的差别之一:参考a.maxa中dkcd的连接条件是现在绝对有效。

慕婉清6462132

有时,当您以错误的方式在查询中使用架构(dbo)时会发生此错误。例如,如果你写:select&nbsp;dbo.prd.namefrom&nbsp;dbo.product&nbsp;prd你会得到错误。在这种情况下,将其更改为:select&nbsp;prd.namefrom&nbsp;dbo.product&nbsp;prd
打开App,查看更多内容
随时随地看视频慕课网APP