0

我有以下查询,它在 p_id 前面加上 p_number

UPDATE table1 t1 
   SET t1.p_id = CONCAT((SELECT CONCAT(t2.p_number,' ') 
                           FROM tble2 t2 
                          WHERE t2.id = t1.p_id)
                        , t1.p_id) 
 WHERE t1.p_id = '19680';

这基本上需要像

t2.p_number:X12
t1.p_id:    19680

并将其变成

t2.p_number:X12
t1.p_id:    X12 19680

我被要求的是一个“回滚”脚本,记住我知道的唯一列是“19680”!我查看了 REPLACE 命令,但不确定我是否可以让它工作;有任何想法吗?


解决!

谢谢大家,那里有一个很好的提示日志,我已经找到了 Ben 的一个非常简单的查询。

这个问题背后有相当多的历史,基本上客户已经输入了 p_id 的值并输入了重复项。因此,他们希望在 p_id 上添加 p_number 前缀,以使它们再次唯一(一旦进入客户端就无法更新),但他们也想要一个 get-out 子句,以防出现问题,因此他们希望能够删除前缀数据。

p_id 实际上是在系统中使用的,因此在这种情况下虚拟表和代码更改实际上并不可行,而是为它们更新客户端数据是最简单的。

干杯,希望客户对提案感到满意。

4

4 回答 4

1

这是我的2c。

不要更新您的原始字段。如果你有可能想要回滚它,那么你会给自己带来巨大的问题。创建一个使用新值更新的新字段。当您想引用此字段时,您可以这样做。当您想引用另一个字段时,您可以这样做。

更一般地说,这对于您想要“修复”的任何字段都是一个很好的策略。您可以稍后改进您“修复”的内容,如果您覆盖了您无法做到的原始数据。始终保留原始数据,然后您可以随意重复使用它。

如果您只想删除第一个空格之前的所有内容,则以下内容将起作用:

update the_table
   set p_id = substr(p_id, instr(p_id, ' ') + 1);

SQL小提琴

于 2013-04-22T10:03:03.410 回答
1

作为一般规则,不要存储您可以推断的数据。

只需在客户端代码、视图或虚拟列 (Oracle 11) 中为字段添加前缀,而无需修改原始值。由于您尚未对其进行修改,因此没有什么可回滚的。

于 2013-04-22T10:08:31.763 回答
0

如果你问如何简单地做到这一点,那么修剪掉前缀直到空格并取回你的原始值。如果您正在寻找更好的选择,那么我会说创建另一列,如“old_p_id”,然后将旧的推入其中。如果你想回滚,你总是可以用 old_p_id 更新 p_id。

+----------------------+
¦ p_id      ¦ old_p_id ¦
¦-----------+----------¦
¦ X12 19680 ¦  19680   ¦
¦ X13 19681 ¦  19681   ¦
+----------------------+
于 2013-04-22T10:05:58.567 回答
0

您使用的是哪个版本的 Oracle?如果是 Oracle 11g,您可以为此使用虚拟列!

alter table table1
add new_column as p_number || ' ' || p_id;

我在这里假设您的所有列都是 varchar 类型。

使用这种方法,您必须更新客户端代码以引用新列。

于 2013-04-22T10:09:18.330 回答