SQL(Oracle)使用计算值更新多行(按毕达哥拉斯定理的距离)

时间:2014-12-12 00:19:23

标签: sql oracle oracle-apex

如何使用从同一记录的另外两列中的值派生的计算数据更新所有行?

情况如下:

我有一张名为customers的表格。它有4列 - Customer_IDCustomer_NameCoordinate_XCoordinate_Y'。由于使用数据创建和填充表格,我添加了一个名为Distance

的空第5列

我想要做的是在Distance列填充计算距离(0,0)到每行Coordinate_XCoordinate_Y列中指定的位置。我想我可以使用毕达哥拉斯的理论 - 当我使用查询时会出现正确的值:

Select SQRT(Power(customers.coordinate_x,2) + Power(customers.coordinate_y,2)) from customers

我摆弄着试图触发 - 由于缺乏经验而失败了。 然后我尝试使用查询填充列 - 也失败了。

我一直在尝试这样的事情;

update customers set distance = (Select SQRT(Power(customers.coordinate_x,2) + Power(customers.coordinate_y,2)) from customers) 

没有什么工作 - 我得到的最好的是ORA-01427: single-row subquery returns more than one row

2 个答案:

答案 0 :(得分:4)

查询比您正在做的更简单:

update customers
    set distance = SQRT(Power(coordinate_x, 2) + Power(coordinate_y, 2)) 

答案 1 :(得分:1)

戈登的回答是正确的。但是,对于此特定示例,使用虚拟列更好,并且在更改客户坐标后您不必更新距离:

create table customers (
  customer_id number,
  customer_name varchar(255),
  coordinate_x number,
  coordinate_y number,
  distance  number generated always as (SQRT(Power(coordinate_x, 2) + Power(coordinate_y, 2))) VIRTUAL

);

请参阅此sqlfiddle:http://sqlfiddle.com/#!4/c6db3/4