对数据的SQL更新作为链表列出

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

标签: sql oracle join

*更新,澄清的问题和示例

我有一个表格,其数据表示为链接列表

即:

ID | FROM_STATE | TO_STATE | SOME_OTHER_COLUMN

我需要更改“指针”以删除BAR的状态。正如你在下面看到的那样,foo去吧,酒吧去com等。我想让foo直接去com,从QUAX到FIZZ。此外,需要从正在删除的记录中选取“SOME_OTHER_COLUMN”中的值,并将其用于替换正在更新的记录中“SOME_OTHER_COLUMN”的值。

ID|FROM_STATE|TO_STATE|SOME_OTHER_COLUMN
 1| FOO      | BAR    | xxx
 1| BAR      | COM    | zzz
 2| QUAZ     | BAR    | aaa
 2| BAR      | FIZZ   | bbb

TO:

ID|FROM_STATE|TO_STATE|SOME_OTHER_COLUMN
 1| FOO      | COM    | zzz
 2| QUAX     | FIZZ   | bbb

我开始编写自我加入并尝试类似:

update 
FOO a
    join FOO b 
      on a.ID = b.ID
     and a.FROM_STATE = b.FROM_STATE

  set a.TO_STATE = b.TO_STATE
where b.FROM_STATE='BAR'
  and a.TO_STATE='BAR';

这不起作用,没有更改行。

我在下面的SQLFilldle中设置了我的表。任何帮助表示赞赏。 DB是oracle(没有版本)

http://sqlfiddle.com/#!2/7e8d08/1

2 个答案:

答案 0 :(得分:0)

您需要2次查询,更新和删除。

UPDATE tbl t SET (To_State,SomeColumn) = 
 (SELECT To_State, SomeColumn
  FROM tbl
  WHERE From_State = t.To_State
  AND Id = t.Id)
WHERE To_State = ?
AND Id = ?;

DELETE FROM tbl
WHERE From_State = ?
AND Id = ?;

答案 1 :(得分:0)

 update 
 FOO a
join FOO b 
  on a.ID = b.ID
 and a.FROM_STATE = b.FROM_STATE

set a.TO_STATE = b.TO_STATE
where b.FROM_STATE = a.TO_STATE;