0

我们每天从 200 个交通站点获取数据,所有站点都有不同的表名,例如 (KGM_000000000001_PVR)。所有站点具有相同的列排序,具有相同的列名。我们总是会收到不同愿望的报告,我们将站点与联合全部结合起来,如下例所示。一直以来,我们将它们与 union all 结合起来,这有点困难。有没有其他简单的方法来获得类似报告(使用循环、案例、for 等)。

莱万特

谢谢

报告代码示例:


SELECT count(class) from C2.KGM_000000000001_PVR WHERE class=9 and RECTIME BETWEEN TO_DATE('01.01.2012','DD.MM.YYYY') AND TO_DATE('01.01.2013','DD.MM.YYYY')
union all
SELECT count(class) from C2.KGM_000000000002_PVR WHERE class=9 and RECTIME BETWEEN TO_DATE('01.01.2012','DD.MM.YYYY') AND TO_DATE('01.01.2013','DD.MM.YYYY')
union all
SELECT count(class) from C2.KGM_000000000003_PVR WHERE class=9 and RECTIME BETWEEN TO_DATE('01.01.2012','DD.MM.YYYY') AND TO_DATE('01.01.2013','DD.MM.YYYY')
union all
.
.
.
SELECT count(class) from C2.KGM_000000000200_PVR WHERE class=9 and RECTIME BETWEEN TO_DATE('01.01.2012','DD.MM.YYYY') AND TO_DATE('01.01.2013','DD.MM.YYYY')
4

3 回答 3

3

您可能希望在所有这些表上创建一个视图,并使用显示表名的伪列“SOURCE”。然后,您的客户端代码可以使用您喜欢的“SOURCE”列上的任何选择来查询这个视图。

CREATE VIEW KGM_ALL AS
SELECT 'KGM_000000000001_PVR' AS SOURCE, * FROM C2.KGM_000000000001_PVR
UNION ALL
SELECT 'KGM_000000000002_PVR' AS SOURCE, * FROM C2.KGM_000000000002_PVR
....

SELECT * from KGM_ALL where SOURCE in ('KGM_000000000001_PVR', ...)

正如@Marlin 所说,不要忘记在源以及您通常从中选择的其他列上创建索引。

于 2013-01-22T15:04:47.997 回答
0

也许你可以使用动态 SQL:

http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/dynamic.htm

然后,您应该能够通过连接它们的名称(而不是使用 where 子句中的数字)来遍历您的表,如下所示:

如何在 pl/sql 中编写遍历数字的循环

于 2013-01-22T15:44:22.167 回答
0

每个表上的字段(类,RECTIME)的索引将减少时间。请务必按照指定的顺序将两个字段都包含在一个索引中。

于 2013-01-22T14:53:39.700 回答