【发布时间】: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