0

我最近开始了一个项目,该项目涉及为一个相当老的软件创建一个基于 Web 的报告界面,该软件负责管理一些访问控制硬件,例如电子门锁。
我选择 CakePHP 来完成这项任务,它所涉及的只是查询数据库中的日志记录并将它们显示在网站上。该软件是用 C++ 编写的并使用 MSDE(Microsoft SQL Server 7.0 或 2000 的缩小版),我能够配置 CakePHP 以便它成功连接到数据库。

问题是该软件的开发人员选择通过为每天创建一个单独的表来将日志存储在数据库中。所以它看起来像这样:

tbl_DoorEvent_2008_08_07
tbl_DoorEvent_2008_08_08
tbl_DoorEvent_2008_08_09
tbl_DoorEvent_2008_08_10
...

我对 MSDE 不是很熟悉,但我仍然怀疑设计和维护这样的数据库是否是一种可接受的做法。我不知道桌面软件如何在所有信息都采用这种格式时解析查询所有信息,但我的 CakePHP 应用程序很难理解这一点。

我想在 Web 应用程序中坚持使用 MVC,但我不知道如何在 CakePHP 中实现 DooreventModel,以便它从所有分区表中获取信息。
我试过实施一些技巧,比如使用

UNION ALL SELECT * FROM tbl_DoorEvent_2008_08_07
UNION ALL SELECT * FROM tbl_DoorEvent_2008_08_08
....

并且这种工作,但是当我想对整个查询或任何其他 SQL 运算符执行 WHERE 限制时,它不起作用。

还有一个要求是,基于 Web 的应用程序不添加或创建任何额外的数据库或表,而只使用现有的数据库或表来显示报告,因此创建一个包含所有集群表的巨大表并不是一个真正的选择。

我只是希望有人会想出一个 SQLServer 函数,每次我执行查询时都会为我将所有表合并为一个,但我知道这有点乐观,所以我真的愿意接受所有建议。请记住,该解决方案必须与 CakePHP 一起使用,并作为 MVC 中的单个模型

4

2 回答 2

3

如果将联合放在子查询中,则可以使用 where 语句:

SELECT *
FROM (
    SELECT * FROM tbl_DoorEvent_2008_08_07
    UNION ALL 
    SELECT * FROM tbl_DoorEvent_2008_08_08
) sub
where sub.MyKey = MyValue

或者创建一个视图:

CREATE VIEW vw_MyView
AS
SELECT * FROM tbl_DoorEvent_2008_08_07
UNION ALL 
SELECT * FROM tbl_DoorEvent_2008_08_08

之后,您可以查询视图:

SELECT * from vw_MyView where MyKey = MyValue

PS 切勿在生产查询中使用 *,尤其是视图。

于 2009-04-12T14:55:14.003 回答
1

您可能想要一个分区视图

于 2009-04-12T14:29:44.893 回答