我想将数据从自己的表数据插入到列中?

问题描述 投票:0回答:1
  • 我有一张名为 T1 的桌子。
  • 我必须将数据插入 T1 表的新列
    Change
  • Change
    列值将是列 openclose(关闭-打开)的差值。
日期时间 打开 关闭 改变
2000年3月14日 1561.55 1567.05
2000年3月15日 1546.8 1620.1
2000年3月16日 1620.4 1562.2
2000年3月21日 1563.3 1556.6

我正在尝试使用以下查询,但出现错误

SQL 错误:ORA-00936:缺少表达式

insert into T1(change) 
values
(
select 
case when open<close then close-open
     when open>close then close-open
end as change
from T1
order by datetime
);
sql oracle-database oracle-sqldeveloper sql-insert
1个回答
1
投票

当您想要填充现有行的列时,您可以使用

update
语句,而不是
insert
语句。只需使用更新语句并应用
set
子句中的表达式即可:

update t1 set change = close-open;

但是,存储派生值并不是一个好的设计实践。如果某人或某些代码更新组件列之一并且忘记更新派生列,会发生什么情况?通过这种方式,您可以轻松获得不一致的数据。最好在查询时计算派生列而不是存储它们。只需在查询原始表时使用的 select 语句中执行此操作即可:

select t1.*,close-open change from t1

如果有一个相当一致使用的公式,那么您可能需要向表中添加一个“虚拟列”,这将在查询时为您应用该公式,就像该值存储在表中一样,尽管事实并非如此 -在幕后,它只是在您查询时计算公式:

alter table t1 add (change number as (close-open) virtual);

现在查询:

select * from t1

或者创建一个嵌入公式的视图:

create view v1 as select t1.*,close-open change from t1

现在查询:

select * from v1

您有很多选项可让您在查询时获取派生值,因此您不必将其实际存储在表中,也不必冒数据不一致的风险。但如果您确实想物理存储它,请使用简单的

update
语句。

© www.soinside.com 2019 - 2024. All rights reserved.