我在一所学校工作,并建立了一个数据库来帮助解决检查哪些 child 去了哪些课后俱乐部的噩梦。
我尝试通过构建一个数据库来做到这一点,该数据库使用链接表从 42 个寄存器(Excel 文档)中的每一个中提取数据。然后,我设置了几个查询,从特定表格中搜索学生,然后生成一份报告,以便每个表格组都可以查看其表格中的 child 是否在特定的一周内去过俱乐部。
我对 SQL 的了解很基础:我可以编写查询来执行各种操作,但不知道如何优化大型查询。
我遇到的问题是每个报告需要 2 分 30 秒才能生成,现在我已将所有 42 个寄存器添加到查询中。以前,当我只有 31 时,报告在 30 秒内生成。
以下是查询示例:
SELECT [UID], [Name], [Group], [Week 1], [Week 2], [Week 3],
[Week 4], [Week 5], [Week 6]
FROM [club 1]
WHERE ((([Club 1].[Group])="group name"))
UNION ALL
SELECT [UID], [Name], [Group], [Week 1], [Week 2], [Week 3],
[Week 4], [Week 5], [Week 6]
FROM [club 42]
WHERE ((([Club 42].[Group])="group name"));
该查询在最初的 SELECT
之后有 41 个 UNION ALL SELECT
,很可能是最无用、写得最糟糕的查询,但是,正如我所说,我的 SQL 知识很基础,而且我正在边学习边学习。
更多信息: 这些登记册上有 480 名学生,一名学生一周内可以参加多个俱乐部,因此查询需要查找学生参加俱乐部的每个实例。
除了将 Access 与 Excel 结合使用之外,其他选项非常非常有限。我和一些 friend 交谈过,研究了 MySQL 方法并在网络上设置本地服务器,但我们的网络是托管服务,管理它的公司很敏感,至少可以说在他们的服务器上设置了类似的东西(这是可以理解的)。
我想,对于我所需要的,这可能是唯一的方法,并且花费 2 分 30 秒进行查询比每周五手动检查每个寄存器花费 30 分钟要好。我试图解决这个问题的原因是:
A) 我想进一步扩展我的编程知识,但到目前为止,我已经成功地错过了 SQL
B) Access 数据库的老师常常不耐烦,在加载报告时随意单击,试图使其更快地工作,或者出于沮丧,经常使 Access 崩溃
最佳答案
我的建议是不要每个俱乐部都有一张 table ,而只有一张带有附加列[Club_Name]
的 table 或一个ID,以便稍后将结果加入到俱乐部 table 中。
这样查询将类似于:
SELECT [UID], [Name], [Group], [Club_Name], [Week 1], [Week 2], [Week 3],
[Week 4], [Week 5], [Week 6]
FROM [Clubs]
WHERE ((([Clubs].[Group])="group name"));
你认为这可能吗?
关于sql - 优化笨拙的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9452862/