我在SO上看到过类似的错误,但我没有找到解决我的问题的方法。 我有一个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;

and

SELECT  maxa ,
        COUNT(*) AS tong
FROM    khaosat
WHERE   CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
                                        AND     'Sep 5 2011'
GROUP BY maxa;

当前回答

相反,你可以尝试像这样连接桌子,

select 
  .... 
from 
   dkcd 
     right join 
                a
                  , b

这应该可以

其他回答

对我有用的是将WHERE子句更改为SELECT子查询

来自:

    DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = [dbo].FetchedTagTransferData.IssueId

TO:

    DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = (SELECT NoteId FROM FetchedTagTransferData)

我也在这个错误中挣扎,最后用了和答案相同的策略。我的回答只是为了确认这是一种应该有效的策略。

这是一个例子,我首先在两个表之间做一个内部连接,我知道得到数据,然后在表上做两个左外部连接,这些表可能有相应的行,可以为空。您混合使用内部连接和外部连接来获得跨表数据的结果,而不是在表之间使用默认的逗号分隔语法,从而错过所需连接中的行。

use somedatabase
go 

select o.operationid, o.operatingdate, p.pasid, p.name as patientname, o.operationalunitid, f.name as operasjonsprogram,  o.theaterid as stueid, t.name as stuenavn, o.status as operasjonsstatus from operation o 
inner join patient p on o.operationid = p.operationid 
left outer join freshorganizationalunit f on f.freshorganizationalunitid = o.operationalunitid
left outer join theater t on t.theaterid = o.theaterid
where (p.Name like '%Male[0-9]%' or p.Name like '%KFemale [0-9]%')

首先:在希望进行数据匹配的表之间进行内部连接。 第二部分:继续使用外部连接,尝试检索其他表中的数据, 但是,如果表外部连接没有得到相应的数据,或者与您在on谓词/条件中设置的条件匹配,这将不会过滤出您的结果集。

在SELECT语句中的列名之间缺少逗号也可能导致此错误。

eg:

SELECT MyCol1, MyCol2 MyCol3 FROM SomeTable;

在我的例子中,问题原来是我给表设置的别名。对于SQL Server来说,“oa”似乎是不可接受的。

对我来说,我使用了错误的别名拼写,它在正确的拼写后工作