2012-02-26 50 views
3

我在一所学校工作,并建立了一个数据库来帮助检查哪些孩子已经去过哪些课后俱乐部的噩梦。优化一个笨拙的查询

我试图通过建立一个数据库,使用链接表从每个42个寄存器(Excel文档)中绘制数据库。然后,我设置了一些查询,从特定表格中搜索学生,然后生成一份报告,以便每个表格小组可以查看他们形式的孩子是否在特定的一周内去过某个俱乐部。我的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的和最有可能是最inificient,眼hurtingly写的不好的查询,但正如我说,我对SQL的知识是基本的,我正在学习。

一些更多信息: 这些注册表中有480名学生,一名学生可以在一周内去多个俱乐部,因此查询需要查找每个学生已经参加了一个俱乐部。

使用Excel以外的选项非常非常有限。我已经和一些朋友谈过了,并且研究了MySQL的方法,并在网络上建立了一个本地服务器,但是我们的网络是一个管理服务,管理它的公司对于在服务器上设置的东西至少不会这么说。可以理解的)。

我想,为了我所需要的,这可能是唯一的方法来做到这一点,并有一个查询需要2分钟30秒比它每周五手动检查每个注册表所需的30分钟更好。我想通过这个排序的原因是:

A)我想进一步扩大我的编程知识,并有,到目前为止,设法错过SQL
B)访问数据库中的教师往往心浮气躁,单击随机加载报告时试图使其工作更快或出于挫折,经常崩溃访问

任何帮助将非常感激,请不要犹豫,询问详情我可能错过了。我愿意尝试任何暗示的建议,因为这对我来说是一个很大的新领域。

+0

我的第一个想法是在Access中构建整个事情,但是这是在业余时间完成的,当我提到删除原始寄存器以替换它们与Access数据库时,存在很多抱怨。 我实际上在学校教授信息通信技术,所以我很高兴设置这一切,但这是一个时间问题。 我已经考虑了答案,我认为唯一的行动方式是找到时间把所有这些都放到Access中。 我为了抱怨而尝试在猪周围使用这种猪头笨拙的方式感到一个白痴。 感谢您的回复。我很快就会回来寻求建议。 – Vred 2012-02-26 15:37:35

回答

2

我的建议并不是每个俱乐部都有一张桌子,但只有一张桌子上有一个额外的列[Club_Name]或一个ID,以便稍后将结果加入到俱乐部桌上。

这样的查询会是这样的:

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")); 

你认为有可能做到这一点?

+0

这是可能的,我正在为自己争取甚至有趣的尝试将现有的“系统”绑在一起进行报告。 我只是为了节省自己的麻烦,建立数据库,只是在需要时提供一些培训。感谢您的答复。 – Vred 2012-02-26 15:47:16

+1

如果你正在重新设计,你也可以考虑摆脱那几周。 – Fionnuala 2012-02-26 16:44:37

1

你所面临的根本问题是,你正在从42个不同的来源提取数据,最终是一个尴尬的机制。这不是你做错了的事情,这只是你的Excel访问系统架构的一个生活事实。

如果网络上的用户拥有使用Access的许可证,那么您可以用共享模式下用户连接的单个Access数据库替换您的42个Excel电子表格。将所有数据保存在一个表格中而不是42个外部链接的数据源将使您获得亚秒级的响应时间来生成报告。

回到VB3的哎呀,我构建了VB和Access应用程序,这些应用程序在网络上被很多人共享。您的网络提供商不可能反对存储在其服务器上的单个文件。

如果您的用户没有使用Access的许可证,那么您可以创建一个简单的ASP.NET前端到共享Access数据库。

一旦您决定转移到单个共享数据库,您还应该确保数据库的设计已标准化,以便您的查询可以简单高效,并且数据维护代码可以很简单。不要以电子表格设计来考虑!如果您要走这条路线并需要模式设计建议,请发表评论以让我知道。

+0

用户确实拥有使用Access的许可,但在一小部分员工之外,我们有很多技术人员正在敲门。 主要问题是电子表格的“系统”是在我到达这里(第一年)之前设置和使用的,而且很多老师都有点偏执。我被要求花几个小时寻找一种方法将它们连接在一起。感谢您的回复,这有助于我看到我自己工作的小盒子。 – Vred 2012-02-26 15:42:39

0

您的基本问题是,您正在尝试针对可怕的数据库编写好的查询。

如果所有42个俱乐部都提供了关于学生的相同数据,那么他们应该都在同一个表中。应该有一个额外的栏目“ClubId”来指示数据属于哪个俱乐部。为了让ClubId有意义,必须成为俱乐部的桌子,并提供有关俱乐部的数据,例如俱乐部的名称。此表有一个名为“Id”的列,它为您的考勤表中的ClubId提供参考点。

还有更好的设计比上述,但这是远在你现在的地方。

了解如何将从excel寄存器获取的表合并到一个表中。了解如何使用连接将来自寄存器的数据与有关俱乐部的数据结合起来。写一个很好的查询。它应该需要几秒钟的时间来处理您的数据量。

+0

正如上面所解释的那样,我被要求在一定的限制条件下工作,以便在我之前设置的“系统”以及许多人感到满意的事情。 按照他们想要的方式保持它是一种痛苦,所以它必须改变!感谢您的答复。 – Vred 2012-02-26 15:45:15