【发布时间】:2019-08-16 18:59:36
【问题描述】:
我有一个 Access 数据库,其中包含约 500 个表,并且所有表中总共有约 16,000 行。我想计算“datecreated”字段在 2019 年 1 月 1 日之前的行数。
我试图通过查询 MsysObjects 并使用按日期过滤的条件为每个表执行 DCount 来做到这一点。
假设我在内容如下的数据集上执行此操作:
table1:总共 10 行,2019 年 1 月 1 日之前的 5 行
table2:总共 10 行,2019 年 1 月 1 日之前的 9 行
table3:共 10 行,2019 年 1 月 1 日之前为 0
创建日期字段
我抽查了 500 张桌子中的一些。 “创建日期”字段是数据类型:日期/时间。格式为 yyyymmdd。
我创建了一个搜索,可以在其中按表获取所有行的计数,并且可以按各个字段过滤该搜索。但是,当我尝试按 datecreated 字段进行过滤时,我得到了奇怪的结果。它没有按照我期望的方式过滤。
1。基线查询(无条件):
(效果很好!)
SELECT MsysObjects.Name, DCount("*",[Name]) AS RecordTotal
FROM MsysObjects
WHERE (((Left$([Name],1))<>"~") AND ((Left$([Name],4))<>"Msys") AND ((MsysObjects.Type)=1))
ORDER BY MsysObjects.Name;
结果:
(结果如预期)
命名记录总数
table1 10
table2 10
table3 10
2。将条件添加到 DCount 的查询(创建日期
SELECT MsysObjects.Name, DCount("*",[Name],"[datecreated]<" & #01/01/2019#) AS RecordTotal
FROM MsysObjects
WHERE (((Left$([Name],1))<>"~") AND ((Left$([Name],4))<>"Msys") AND ((MsysObjects.Type)=1))
ORDER BY MsysObjects.Name;
预期结果:
SELECT MsysObjects.Name, DCount("*",[Name],"[datecreated]<" & #01/01/2019#) AS RecordTotal
FROM MsysObjects
WHERE (((Left$([Name],1))<>"~") AND ((Left$([Name],4))<>"Msys") AND ((MsysObjects.Type)=1))
ORDER BY MsysObjects.Name;
命名记录总数
table1 5
表2 9
table3 0
实际结果:
命名记录总数
table1 0
table2 0
table3 0
3。在 DCount 中添加了不同格式条件的查询(datecreated
SELECT MsysObjects.Name, DCount("*",[Name],"[datecreated]<" & #20190101#) AS RecordTotal
FROM MsysObjects
WHERE (((Left$([Name],1))<>"~") AND ((Left$([Name],4))<>"Msys") AND ((MsysObjects.Type)=1))
ORDER BY MsysObjects.Name;
预期结果:
SELECT MsysObjects.Name, DCount("*",[Name],"[datecreated]<" & #20190101#) AS RecordTotal
FROM MsysObjects
WHERE (((Left$([Name],1))<>"~") AND ((Left$([Name],4))<>"Msys") AND ((MsysObjects.Type)=1))
ORDER BY MsysObjects.Name;
命名记录总数
table1 5
表2 9
table3 0
实际结果:
"查询表达式 DCount("*",[Name],"[datecreated]
4。向 DCount 添加了带有奇怪标准的查询(创建日期 > 01/01/9999):
SELECT MsysObjects.Name, DCount("*",[Name],"[datecreated]>" & #01/01/9999#) AS RecordTotal
FROM MsysObjects
WHERE (((Left$([Name],1))<>"~") AND ((Left$([Name],4))<>"Msys") AND ((MsysObjects.Type)=1))
ORDER BY MsysObjects.Name;
预期结果:
命名记录总数
table1 0
table2 0
table3 0
实际结果:
命名记录总数
table1 10
table2 10
table3 10
【问题讨论】:
-
@stickybit 完成。
-
为什么Access数据库中有近500个表?这更像是一个数据库设计问题,而不是 SQL 问题。如果表的结构相同,并带有后缀以区分,请考虑将所有表迁移到 one 表并避免使用
MSys表。访问表没有行限制。 -
@Parfait - 不错,建议很好。这将是另一天的任务,届时我们可能会完全从访问中删除数据库。这是一个组织数据库,我最近才参与其中。