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 更新以链表形式排列的数据的主要内容,如果未能解决你的问题,请参考以下文章