【问题标题】:SQL-Oracle: Updating table multiple row based on values contained in the same tableSQL-Oracle:根据同一表中包含的值更新表多行
【发布时间】:2015-10-07 15:35:02
【问题描述】:

我有一张名为: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 更新中只会输出一行,并且可能会更新数千行具有相同地址和名称且属于订单号的行。

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

亲切的问候

【问题讨论】:

    标签: sql oracle merge cursor sql-update


    【解决方案1】:

    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)
    

    【讨论】:

    • 成功了!!!太棒了...请问为什么 rownum
    • rownum &lt; 2 并不比rownum = 1 好,但我确实倾向于避免使用=rownum 的习惯,因为对于1 以外的值,它不会'没道理。但这只是一种偏好。至于更新风格,我没有意识到它是一种风格。这只是我想到的第一件事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多