【问题标题】:Is there a shorter way for "Union All" using in SQL在 SQL 中使用“Union All”是否有更短的方法
【发布时间】:2013-01-05 20:04:12
【问题描述】:

我们每天从 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')

【问题讨论】:

  • 您可以一次生成所有表的视图,然后使用该视图进行选择。至少缩短了每个报告所需的 SQL。
  • 你能把它全部存储在一个带有站名字段的表中吗?这样您就不需要合并 200 个不同的表。
  • 动态 SQL 是一个选项
  • 为什么不规范化该表并只创建一个?
  • @Plouf!:但是您将节省的钱用于解决(损坏的)设计引起的问题。我想知道什么更便宜...

标签: sql oracle


【解决方案1】:

您可能希望在所有这些表上创建一个视图,并使用显示表名的伪列“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 所说,不要忘记在源以及您通常从中选择的其他列上创建索引。

【讨论】:

  • 首先非常感谢您的回答。如果我们通过组合所有表来创建视图,我们将如何将每个表的数据与视图不同。例如,我们想分别从每个表中获取一个月的汽车数量。(不是所有表中的汽车总数作为一个结果)。我们可以通过使用您创建的视图来做到这一点吗?什么是必要的代码?
  • @leventgulec:鉴于上述观点,您可以在 SQL 查询中添加 where source = 'KGM_000000000001_PVR'。您甚至可以同时查询多个来源。
  • @leventgulec,来自@Plouf 的评论!以上是正确的(即使语气有问题)。您需要类似“SELECT source, count(*) from KGM_ALL where month='Jan' GROUP BY SOURCE HAVING SOURCE IN ('..001', '..002')”之类的东西。这应该可以让您计算两个区域的给定月份的计数。是的,@Plouf!是的,这是非常基本的 SQL :-)
  • @mgaert,在您的帮助下,我们缩短了查询时间。非常感谢。最好的问候。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    也许你可以使用动态 SQL:

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

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

    how to write loop in pl/sql that goes over numbers

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      相关资源
      最近更新 更多