我需要有关从Postgres Db中的另一个表更新表的帮助。
长话短说,我们最终在db中破坏了数据,现在我需要用另一个表中的值更新一个表。
我有包含此数据table wfc
的表:
| step_id | command_id | commands_order |
|---------|------------|----------------|
| 1 | 1 | 0 |
| 1 | 2 | 1 |
| 1 | 3 | 2 |
| 1 | 4 | 3 |
| 1 | 1 | 0 |
| 2 | 2 | 0 |
| 2 | 3 | 1 |
| 2 | 3 | 1 |
| 2 | 4 | 3 |
并且我想从另一个表更新command_order列中的值,所以我可以得到如下结果:
| step_id | command_id | commands_order|
|---------|------------|---------------|
| 1 | 1 | 0 |
| 1 | 2 | 1 |
| 1 | 3 | 2 |
| 1 | 4 | 3 |
| 1 | 1 | 4 |
| 2 | 2 | 0 |
| 2 | 3 | 1 |
| 2 | 3 | 2 |
| 2 | 4 | 3 |
这看起来很容易,但是问题是要为相同的command_id
更新行,它正在commands_order
中写入相同的值
SQL是:
UPDATE wfc
SET commands_order = CAST(sq.input_step_id as INTEGER)
FROM (
SELECT wfp.step_id, wfp.input_command_id, wfp.input_step_id
from wfp
order by wfp.step_id, wfp.input_step_id
) AS sq
WHERE (wfc.step_id=sq.step_id AND wfc.command_id=CAST(sq.input_command_id as INTEGER));
SQL小提琴http://sqlfiddle.com/#!15/4efff4/4
我对此很坚持,请帮忙。
谢谢。
答案 0 :(得分:0)
假设您尝试按创建顺序对行进行编号,并且只要您了解ctid将在更新时使用VACCUUM FULL进行更改,则可以执行以下操作:
select step_id, command_id, rank - 1 as command_order
from (select step_id, command_id, ctid as wfc_ctid, rank() over
(partition by step_id order by ctid)
from wfc) as wfc_ordered;
这将为您提供wfc表以及所需的顺序。如果您确实更新了原始表,则ctid将会更改,因此使用上述查询创建表副本可能更安全。