我最近开始研究一个项目,该项目涉及为一个相当古老的软件创建一个基于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应用程序正在努力解决这个问题。
我想坚持使用MVC作为Web应用程序,但我不知道如何在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中的单个模型
答案 0 :(得分: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
P.S。切勿在生产查询中使用*,特别是在视图中不使用。
答案 1 :(得分:1)
您可能需要partitioned view?