【发布时间】:2014-04-17 02:49:59
【问题描述】:
问题
我在一个 MS Access 数据库中工作,该数据库将发票条目转换为会计总帐代码。数据库有时会“拆分”记录(例如,包含单一费用的发票可能需要将该费用分配给多个不同的业务部门)。在使用 INSERT INTO 查询将“拆分”记录插入数据库表后,我编写了一个 SQL 查询来删除“父”记录。不幸的是,我主要是通过反复试验来编写的,而且运行速度非常慢(我相信这是嵌套子查询的结果)。
我可以做些什么来优化这个查询?
数据库说明
举例来说,如果表格包含以下内容:
[类型]----[费用]----[说明]--------[发票金额]
5000------NoDept------40 SQL 头盔--------------$500
该记录的拆分可能如下所示:
[类型]----[费用]----[说明]--------[发票金额]
5000--------NoDept------40 SQL 头盔-------------$500
5000-----NoDept-----40 SQL Helmets_%Split----$200
5000-----NoDept-----40 SQL Helmets_%Split----$75
5000-----NoDept-----40 SQL Helmets_%Split----$225
在我的 SQL 语句清理完表之后,它应该是这样的:
[类型]----[费用]----[说明]--------[发票金额]
5000-----NoDept-----40 SQL Helmets_%Split----$200
5000-----NoDept-----40 SQL Helmets_%Split----$75
5000-----NoDept-----40 SQL Helmets_%Split----$225
当前 SQL
DELETE *
FROM [tblManipulateW]
WHERE EXISTS
(SELECT * FROM
(SELECT SUM([Dupe].[Invoice Amount]) AS [SumInvoices],
[Dupe].[Type],
[Dupe].[Charge],
LEFT([Dupe].[Description], Len([Dupe].[Description]) - 7) As DescriptionLessSplit
FROM [tblManipulateW] AS [Dupe]
GROUP BY [Dupe].[Type],
[Dupe].[Charge],
LEFT([Dupe].[Description], LEN([Dupe].[Description])-7),
[Dupe].[Description] LIKE "*_%Split"
HAVING [Dupe].[Description] LIKE "*_%Split") AS [Dupe2]
WHERE [Dupe2].[DescriptionLessSplit] = [tblManipulateW].[Description]
AND [Dupe2].[Type] = [tblManipulateW].[Type]
AND ROUND([Dupe2].[SumInvoices],2) = ROUND([tblManipulateW].[Invoice Amount],2)
AND [Dupe2].[Charge] = [tblManipulateW].[Charge]);
SQL解释
子子查询构建了一个名为 Dupe2 的查询,该查询查找所有已拆分的类似费用并返回:
- 他们发票金额的总和
- 他们的描述少了短语“_%Split”
- 他们的收费代码
- 他们的类型代码
子查询正在检查主表中的项目何时与从子查询(即 Dupe2)返回的项目相匹配。如果一个条目确实匹配每个字段,那么它将被删除。
非常感谢您看这个!
【问题讨论】:
标签: sql performance ms-access optimization subquery