首先我是Postgres的新手,所以我可能错误地描述了这个问题,所以如果已经回答了,请指出我的答案。
我有一个包含 10 列的数据库。假设 4 列都对值使用相同的代码(即字母 a、b、d、e(,我想将查询中的所有这些重命名为它们与另一个表中的值匹配的名称。
在这个阶段,我有一个很长的方法,涉及嵌套的 With 语句。有没有一个简单的方法可以说:
table1
:
id | col1 | col2 | col3 | col4
------+------+------+------+------
Row_1 | a | c | d | e
Row_2 | c | c | c | c
Row_3 | e | d | d | c
查找表:
code | value
-----+---------
a | apple
b | banana
c | catfish
d | dog
e | egg
期望的结果:
Row_1 | apple | catfish | dog | egg
Row_2 | catfish | catfish | catfish | dog
Row_3 | egg | dog | dog | catfish
是的,https://dba.stackexchange.com/questions/145038/how-to-join-to-the-same-table-multiple-times 基本上应该适合你。但是你想要一个UPDATE
,这有点不同:
无论哪种方式,出于显而易见的原因,必须UNIQUE
表lookup
中的code
值。
更新单个列很简单:
UPDATE table1 t
SET col1 = l.value
FROM lookup l
WHERE t.col1 = l.code;
如果未找到匹配项,则不会更新它table1
的行。 但是,为每一列运行单独的更新比一次更新所有列要昂贵得多 - 这有点棘手:
UPDATE table1 t
SET col1 = COALESCE(l1.value, t.col1)
, col2 = COALESCE(l2.value, t.col2)
, col3 = COALESCE(l3.value, t.col3)
, col4 = COALESCE(l4.value, t.col4)
FROM table1 t1
LEFT JOIN lookup l1 ON t.col1 = l1.code
LEFT JOIN lookup l2 ON t.col2 = l2.code
LEFT JOIN lookup l3 ON t.col3 = l3.code
LEFT JOIN lookup l4 ON t.col4 = l4.code
WHERE t1.id = t.id;
在这种情况下,将更新所有行。虽然table1
中可能有NULL
值,lookup
中可能有缺失值,但我们需要LEFT [OUTER] JOIN
不要从更新中排除行。因此,我们需要在FROM
子句中table1
的另一个实例,并对此LEFT JOIN
。
添加的COALESCE
保留未找到匹配项的每个单独列的原始值。最佳查询取决于您的问题中未披露的详细信息......
您可以添加另一个WHERE
子句以排除没有任何更改的行。看:
- 如何(或我可以(在多列上选择不同?