【问题标题】:Update column with another column value of different row in same table使用同一表中不同行的另一个列值更新列
【发布时间】:2023-01-11 14:21:17
【问题描述】:

我有一张表,我在其中存储条目的属性。

  • Id - 外键。指出另一个表中的实际条目。
  • Key - 属性的键。
  • 值 - 属性的值。

当前表结构:

id Key Value
1 property1 value11
1 oldvalue oValue1
1 newvalue nValue1
2 property1 value12
2 oldvalue oValue2
2 newvalue nValue2
3 property1 value13
3 oldvalue oValue3
3 newvalue nValue3

我新添加了列Previous Value,我想将属性的旧值和新值存储在一行而不是两行中。因此,我需要将“oldvalue”键的值复制到具有相同 id 的新列中,并将“newvalue”键重命名为“value”。此外,这需要对所有存在旧值属性值的 id 迭代地完成。

目标表结构:

id Key Value Previous Value
1 property1 value11 null
1 value nValue1 oValue1
2 property1 value12 null
2 value nValue2 oValue2
3 property1 value13 null
3 value nValue3 oValue3

所以基本上,对于每个ID,如果存在“oldvalue”键的键值,则将属性“oldvalue”的值复制到相同 ID 的键“newvalue”的Previous Value列。然后将所有“newvalue”键重命名为新的“value”。

上面的目标表结构是我在添加“Previous Value”列后最后需要的。

我为 SQL Server 编写了一个 SQL 查询,它正在运行:

update t1 set t1.previous_value = t2.value
from PROPERTIES_TABLE t1,
     PROPERTIES_TABLE t2
where t1.id = t2.id
  AND t1.key = 'newvalue'
and t2.key = 'oldvalue';


update PROPERTIES_TABLE
set key = 'value'
where key = 'newvalue';

但是查询不起作用,因为别名在 PostgreSQL 中不起作用。

【问题讨论】:

  • 仅供参考,现在是 2023 年,ANSI-92 显式 JOIN 语法已经存在了超过30年;没有理由再使用 ANSI-89 隐式 JOIN 语法。 (R)DBMS 的最新版本甚至不支持旧隐式连接语法的许多功能。 Bad Habits to Kick : Using old-style JOINs
  • 我也必须承认,一个名为 id 的列不是唯一的,它实际上并不是一个标识符;标识符通常在本质上是唯一的。

标签: sql postgresql sql-update


【解决方案1】:

在 PostgreSQL 中,UPDATE 的目标表应该不是在 FROM 子句中重复。

update PROPERTIES_TABLE t1 
  set t1.previous_value = t2.value
from PROPERTIES_TABLE t2
where t1.id = t2.id
  AND t1.key = 'newvalue'
and t2.key = 'oldvalue';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-09
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    相关资源
    最近更新 更多