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

您混合了隐式连接和显式连接。这是允许的,但您需要知道如何正确地做到这一点。

问题是,显式连接(使用JOIN关键字实现的连接)优先于隐式连接('逗号'连接,其中连接条件在where子句中指定)。

以下是你的问题的提纲:

SELECT
  …
FROM a, b LEFT JOIN dkcd ON …
WHERE …

你可能希望它是这样的:

SELECT
  …
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …

也就是说,表a和b的组合与表dkcd连接。事实上,正在发生的事情是

SELECT
  …
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …

也就是说,正如您可能已经理解的那样,dkcd是专门针对b且仅针对b连接的,然后连接的结果与a结合,并使用WHERE子句进一步筛选。在这种情况下,ON子句中对a的任何引用都是无效的,此时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

这里首先连接表a和b,然后将结果连接到dkcd。基本上,这是与您的查询相同的查询,只是对其中一个连接使用了不同的语法,这产生了很大的不同:dkcd的连接条件中的引用a.maxa现在是绝对有效的。

正如@Aaron Bertrand所正确指出的,您可能应该在ORDER BY子句中使用特定的别名限定maxa,可能是a。


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

例如,如果你写:

select dbo.prd.name
from dbo.product prd

您将得到错误。

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

select prd.name
from dbo.product prd

我是SQL的新手,但在我参加的一门课程中遇到了这个问题,并发现将查询分配给项目特别有助于消除多部分错误。例如,我创建的项目是CTU SQL项目,所以我确保我开始我的脚本使用[CTU SQL项目]作为我的第一行如下。

USE [CTU SQL Project]
SELECT Advisors.First_Name, Advisors.Last_Name...and so on.

如果此错误发生在UPDATE中,请再次检查表上导致错误的列/字段的JOIN。

在我的例子中,这是由于缺乏JOIN本身,它由于未知字段而产生了相同的错误(正如Andriy指出的那样)。


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

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

这应该可以


如果你给了盟友的名字,把它改成实际的名字

例如

SELECT  
    A.name,A.date
  FROM [LoginInfo].[dbo].[TableA] as A
   join 
  [LoginInfo].[dbo].[TableA] as B 
  on  [LoginInfo].[dbo].[TableA].name=[LoginInfo].[dbo].[TableB].name;

把它改成

SELECT  
    A.name,A.date
  FROM [LoginInfo].[dbo].[TableA] as A
   join 
  [LoginInfo].[dbo].[TableA] as B 
  on  A.name=B.name;

SELECT DISTINCT
        phuongxa.maxa ,
        quanhuyen.mahuyen ,
        phuongxa.tenxa ,
        quanhuyen.tenhuyen ,
        ISNULL(dkcd.tong, 0) AS tongdkcd
FROM    phuongxa ,
        quanhuyen
        LEFT OUTER JOIN ( SELECT    khaosat.maxa ,
                                    COUNT(*) AS tong
                          FROM      khaosat
                          WHERE     CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
                                                              AND
                                                              'Sep 5 2011'
                          GROUP BY  khaosat.maxa
                        ) AS dkcd ON dkcd.maxa = maxa
WHERE   phuongxa.maxa <> '99'
        AND LEFT(phuongxa.maxa, 2) = quanhuyen.mahuyen
ORDER BY maxa;

我在SQL SERVER中遇到了同样的错误消息,因为我有多个连接,改变连接的顺序为我解决了这个问题。


我的错误是使用了表中不存在的字段。

表1。Field1 =>不存在

表二。Field1 =>正确

更正表名。

我的错误是因为使用WITH

WITH RCTE AS (
   SELECT...
)
SELECT RCTE.Name, ...
FROM 
  RCTE INNER JOIN Customer
  ON RCTE.CustomerID = Customer.ID 

当用于连接其他表时…


你是不是忘了找几张桌子?如果不是,那么你可能需要使用一些别名。


我从JDBC得到了同样的错误。检查了一切,我的问题是好的。结果,在where从句中我有一个论证:

where s.some_column = ?

我传入的参数值是null。这也给出了同样的错误,这是误导性的,因为当你搜索互联网时,你会发现查询结构有问题,但在我的情况下不是这样。只是觉得有人可能会面临同样的问题


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


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

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

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谓词/条件中设置的条件匹配,这将不会过滤出您的结果集。


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

来自:

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

TO:

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

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

eg:

SELECT MyCol1, MyCol2 MyCol3 FROM SomeTable;

对我来说,问题是我愚蠢地调用一个DB函数没有空括号select [apo]。[GenerateNationalIdFrance]而不是select [apo].[GenerateNationalIdFrance]()…我花了几分钟才意识到这一点,但对大三学生来说值得一提:-)


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