问题描述
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 个以上的表
解决方法
目前,您的查询存在许多语法和次优问题:
-
GROUP BY:在
SELECT
子句中包含非聚合列的聚合查询中,必须使用GROUP BY
。某些方言允许省略GROUP BY
列,但不允许省略 Access SQL。此外,DISTINCT
不需要GROUP BY
。 -
别名:每当使用子查询和连接时,始终使用表别名以避免派生表的名称冲突和所有表达式的列别名。此外,避免使用 A、B、C ... 以获取更多信息别名,包括 T。请参阅 Bad Habits to Kick : Using table aliases like (a,b,c) or (t1,t2,t3)。
-
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