首先我是新来的博士后,所以我可能是描述这个问题不正确,所以请给我一个答案,如果它已经被回答。
我有一个有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/

10-12 00:32
查看更多