SQL-Oracle:根据同一个表中包含的值更新表多行

时间:2015-10-07 15:35:03

标签: sql oracle merge cursor sql-update

我有一个名为ORDERS的表

此表包含OrderNumber,它属于该人的同一个人和相同的地址行。

但有时数据不一致; 例如,查看表截图:Orders table with bad data to fix -

你们都注意到orderNumber 1有一个与line1-2-3-4相关联的名称。有时这些都是由某些角色所有,甚至是空的。

我的目标是使用已经存在的一组数据更新所有这3行,并将所有3行均等地设置。

更清楚地说明预期的结果应该是这样的:

enter image description here

我目前正在使用MERGE语句来避免使用CURSOR(for循环)

但是我遇到了问题才能让它发挥作用

这里是SQL

    MERGE INTO ORDERS O USING
    (SELECT
     INNER.ORDERNUMBER,
      INNER.NAME,
      INNER.LINE1,
      INNER.LINE2,
      INNER.LINE3,
      INNER.LINE4
    FROM ORDERS INNER
      ) TEMP 
ON( O.ORDERNUMBER  = TEMP.ORDERNUMBER  )
WHEN MATCHED THEN
  UPDATE
  SET 
          O.NAME = TEMP.NAME,
          O.LINE1 = TEMP.LINE1,
          O.LINE2 = TEMP.LINE2,
          O.LINE3 = TEMP.LINE3,
          O.LINE4 = TEMP.LINE4;

我面临的最大问题是随机选择3行中的一行 - 这与数据无关 - 我选择更新行的行 只要我对订单号做出相同的记录,就可以了。

我也使用了ROWNUM =1但它在multip [le更新中只会输出一行并更新数千行具有相同地址和名称的行,这些行属于订单号。

订单号是要使用的连接列...

亲切的问候

1 个答案:

答案 0 :(得分:0)

update语句中的简单相关子查询应该有效:

update orders t1
   set (t1.name, t1.line1, t1.line2, t1.line3, t1.line4) =
          (select t2.name, t2.line1, t2.line2, t2.line3, t2.line4
             from orders t2
            where t2.OrderNumber = t1.OrderNumber
              and rownum < 2)