首先我是新来的博士后,所以我可能是描述这个问题不正确,所以请给我一个答案,如果它已经被回答。
我有一个有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
:
无论哪种方式,表中的值都必须小于cc,原因很明显。
更新单个列很简单:
UPDATE table1 t
SET col1 = l.value
FROM lookup l
WHERE t.col1 = l.code;
如果未找到匹配项,则不会更新其
code
的行。但是,对每一列运行单独的更新要比同时更新所有列要昂贵得多—这有点棘手:
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;
在这种情况下,将更新所有行。虽然
lookup
中可能有UNIQUE
值或table1
中缺少值,但我们需要NULL
不将行从更新中排除。因此,我们需要在table1
子句中使用lookup
的另一个实例,并将其转换为LEFT [OUTER] JOIN
。添加的
table1
将保留未找到匹配项的每个列的原始值。最佳查询取决于问题中未披露的详细信息。。。您可以添加另一个
FROM
子句来排除没有任何更改的行。见:How do I (or can I) SELECT DISTINCT on multiple columns?
关于sql - 将新值映射到sql查询的有效方法(即4个具有相同凭据的列),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57790660/