SQL 更新以链表形式排列的数据

Posted

技术标签:

【中文标题】SQL 更新以链表形式排列的数据【英文标题】:SQL updates to data layed out as linked list 【发布时间】:2014-12-30 00:12:23 【问题描述】:

* 更新、澄清问题和示例

我有一个表,其中的数据表示为链表

即:

ID|FROM_STATE|TO_STATE|SOME_OTHER_COLUMN

我需要改变“指针”来移除 BAR 的状态。正如您在下面看到的,foo 进入 bar,bar 进入 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

到:

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

我首先编写了一个 self join 并尝试了类似的东西:

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

【问题讨论】:

根据你的描述结果:1| FOO | BAR | xxx实际上应该是1| FOO | COM | xxx??? 所有ID都等于1,a.FROM_STAGE可能是a.FROM_STATE? @AaronLS,是的,这是一个错字。感谢收看 【参考方案1】:
 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;

【讨论】:

解释一下这与 OP 尝试的方法有何不同并且是对问题的回答可能会很有用。【参考方案2】:

您需要 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 = ?;

【讨论】:

感谢您的回答,我有很多行,并且真的不想检查并确定每个符合模式的 ID 号,然后在 where 子句中枚举它们。 我不知道你所说的“遍历每一行”是什么意思。您只需传递要删除的行的链表 id 和 from_state 。如果您尝试做其他事情,您应该更新您的问题。 我不知道我要删除的每一行的 ID,我想我可以尝试类似 where ID in (select ID ....) 尝试查询时出现错误 - “单行子查询返回多行”。 这意味着 (ID,From_State) 对于我假设的表来说不是唯一的。我的假设:表包含多个链表,由 ID 标识。每个列表都有许多项目,由 From_State 标识。或者您不是真的在谈论链接列表,而是在谈论树?如果我的假设不正确,请相应地更新您的问题。

以上是关于SQL 更新以链表形式排列的数据的主要内容,如果未能解决你的问题,请参考以下文章

从客户端发送结构并使用 SUN-RPC 以链表的形式保存到服务器

Leetcode--合并两个有序链表(21)

基础Linux命令总结

HashMap

hashmap实现原理

初识HashMap