【问题标题】:Oracle Creating Table using Data from Previous Tables with CalculationsOracle 使用以前表中的数据和计算创建表
【发布时间】:2019-10-13 19:00:35
【问题描述】:

我目前有两张表,cts(time, symbol, open, close, high, low, volume) 和股息(time, symbol,股息)。我正在尝试创建第三个名为divide_percent 的表,其中包含时间、日期和百分比列。要获得股息的百分比,我相信公式是 ((close-(open+dividend))/open)*100。

但是,请求超出了 oraclexe 允许的大小,因此失败了,但我认为我的请求不应该那么大。

SQL> create table dividend_percent 2 as (select c.Time, c.Symbol, (((c.close-(c.open+d.dividend))/c.open)*100) P RCNT 3 from cts c inner join dividend d 4 on c.Symbol=d.Symbol); from cts c inner join dividend d * ERROR at line 3: ORA-12953: The request exceeds the maximum allowed database size of 11 GB

是我写错了查询还是以这种方式效率低下?这两张桌子很大,但我觉得不大。

【问题讨论】:

  • 您只是加入 Symbol,您不想使用日期和/或时间来缩小范围吗?否则,您将匹配多对多。另外,您真的想要另一个表还是只创建一个包含所需字段的视图?
  • 是的,虽然现在我得到了第 2 行除数等于 0 的错误,所以我猜我的公式或数据也有问题。
  • 查看是否存在 c.open = 0 的记录。如果是,则必须处理该条件。
  • 在达到 11GB 上限之前,您还剩下多少空间?看select sum(bytes)/1024/1024/1024 gb from dba_segments;

标签: sql database oracle


【解决方案1】:

也许您可以创建一个视图,将两个表结合起来并在需要时执行必要的计算:

CREATE VIEW DIVIDEND_PERCENT_VIEW AS
  SELECT c.TIME,
         c.SYMBOL, 
         ((c.CLOSE - (c.OPEN + d.DIVIDEND)) / c.OPEN) * 100 AS PRCNT
    FROM CTS c
    INNER JOIN DIVIDEND d
      ON c.SYMBOL = d.SYMBOL AND
         c.TIME = d.TIME
    WHERE c.OPEN <> 0;

这将避免重复数据,无需将所有内容存储两次,并对创建视图后添加的数据以及预先存在的数据执行PRCNT 计算。

【讨论】:

    【解决方案2】:

    如果您打算执行 DML 操作并保持表同步,也许您可​​以使用 materialized view

    【讨论】:

      猜你喜欢
      • 2012-11-09
      • 1970-01-01
      • 2011-07-01
      • 2022-01-18
      • 2017-09-30
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      相关资源
      最近更新 更多