微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

找不到 MS Access SQL FROM 子句语法错误

如何解决找不到 MS Access SQL FROM 子句语法错误

Select distinct [Doc Type],[Customer Number],count([Customer Number]),[T] From (
Select distinct A.[Customer Number] & A.[Membership Number],A.[Customer Number],B.[Doc Type ],B.[SumOpenAmount] From(
SELECT distinct [Doc Type],Sum([Open Amount]) as T  FROM Data Where [Doc Type] = 'RU')B,[Data] A
Where B.[Customer Number] = A.[Customer Number] Group by [Doc Type]) 
group by [Doc Type],[Customer Number]
having count([Customer Number]) = 1

抛出一个错误,即 Doc Type 可以引用 sql 语句的 from 子句中列出的 1 个以上的表

解决方法

目前,您的查询存在许多语法和次优问题:

  1. GROUP BY:在 SELECT 子句中包含非聚合列的聚合查询中,必须使用 GROUP BY。某些方言允许省略 GROUP BY 列,但不允许省略 Access SQL。此外,DISTINCT 不需要 GROUP BY

  2. 别名:每当使用子查询和连接时,始终使用表别名以避免派生表的名称冲突和所有表达式的列别名。此外,避免使用 A、B、C ... 以获取更多信息别名,包括 T。请参阅 Bad Habits to Kick : Using table aliases like (a,b,c) or (t1,t2,t3)

  3. EXPLICIT JOIN:使用显式连接的当前 ANSI SQL 标准,而不是使用 WHERE 的过时的隐式连接。见Explicit vs implicit SQL joins

因此,请考虑采用上述准则进行以下调整。

SELECT [doc type],[customer number],COUNT([customer number]) As CountCustomerNumber          -- ALIAS ADDED,SUM([SumOpenAmount]) As TotalOpenAmount                  -- AGGREGATED COLUMN
FROM   
      (SELECT d.[customer number] & d.[membership number] AS CustMemb  -- ALIAS ADDED,d.[customer number],agg.[doc type],SUM(agg.[TotalSubOpenAmount]) AS SumOpenAmount    -- AGGREGATED COLUMN
        FROM  (SELECT [doc type],SUM([open amount]) AS TotalSubOpenAmount  -- INFORMATIVE ALIAS
               FROM   data
               WHERE  [doc type] = 'RU'
               GROUP BY [doc type],[customer number]
              ) agg                                             -- INFORMATIVE ALIAS
        INNER JOIN [data] d                                     -- INNER JOIN USED
           ON  d.[customer number] = agg.[customer number]
        GROUP  BY d.[customer number] & d.[membership number]   -- GROUP BY COLUMNS ADDED,agg.[doc type]
      ) AS sub                                                  -- ALIAS ADDED
GROUP  BY [doc type],[customer number]
HAVING COUNT([customer number]) = 1 

注意:由于 Access 不支持查询中的注释。运行前删除所有 -- 消息。

,

因此,这是执行 aliasing 的一个很好的理由。我认为发生的事情是您最内层 (data) 子查询返回 doctype(成为 b 作为外部子查询的一部分),并且 a 也有一个 {{1} }.您还可以删除内部的 doc type 子句,因为它是在最外面的查询上完成的;结果应该是一样的。

我还注意到您执行了以下操作:Group By 然后不对列执行任何操作。如果你想用它做一些事情,你应该命名列。我在下面将其命名为 A.[Customer Number] & A.[Membership Number],您可以随意选择。

我说你也在用 CMN 行隐式 JOIN 是否正确?如果是这样,您应该考虑明确说明,否则最终可能会出现不希望的匹配。

如果这就是您想要的,请执行以下操作:

) as B,[Data] A

这样,您可以去掉 -- as B,[Data] A ++ as B LEFT JOIN [Data] as A on a.[Customer Number] = b.[Customer Number] 行(当然是在测试之后),最终会得到一个更明确定义的 Where B.[Customer Number] = A.[Customer Number] 。看看底部的样子。

第一个 JOIN 是让您绊倒的原因。

当提到字段时,我个人倾向于总是添加别名,除非我只使用一个简单的单行,一个表/视图,即使没有任何具有相似名称的字段,因为我通常结束以后有重复的名字。即便如此,我也会尝试添加别名,因为以后如果我决定要添加更多字段/表,它不会让我重新考虑整个事情。

试试这个(如果你不做隐式 Group by [Doc Type]):

JOIN

如果您想要明确的 Select distinct c.[Doc Type],c.[Customer Number],c.CMN,count(c.[Customer Number]),c.[T] From ( Select distinct (A.[Customer Number] & A.[Membership Number]) as CMN,A.[Customer Number],B.[Doc Type],B.[SumOpenAmount] From( SELECT distinct d.[Doc Type],d.[Customer Number],Sum(d.[Open Amount]) as T FROM Data as d Where d.[Doc Type] = 'RU' ) as B,[Data] A Where B.[Customer Number] = A.[Customer Number] ) as C group by C.[Doc Type],C.[Customer Number],C.CMN having count(C.[Customer Number]) = 1 (推荐),请执行此操作:

JOIN

(去除多余空格)

,

看起来子查询中的 B.[DOC TYPE ] 在字段名称中有一个额外的空格。 此外,子查询不引用内部子查询的 [T] 字段,因此除非它在数据表中,否则它对主查询不可用。
最后,外部子查询的 group by 没有指定 [Doc Type] 来自哪个数据源进行分组。

试试这个

Select distinct 
    [Doc Type],[Customer Number],count([Customer Number]),[T] 
From 
    (
        Select 
            distinct A.[Customer Number] & A.[Membership Number],B.[T] 
        From
            (
                SELECT distinct 
                    [Doc Type],Sum([Open Amount]) as T  
                FROM 
                    Data 
                Where [Doc Type] = 'RU'
            )B,[Data] A
        Where B.[Customer Number] = A.[Customer Number] 
        Group by B.[Doc Type]
    ) 
group by [Doc Type],[Customer Number]
having count([Customer Number]) = 1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。