我有以下查询,其中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_number添加到p_id上以使它们再次成为唯一(一旦输入客户端无法更新),但是他们也想要一个get-out子句,以防出现问题所以他们希望能够删除前缀数据。
p_id实际上是在系统中使用的,因此虚拟表和代码更改在这种情况下并不真正可行,而只是更新客户端的数据是最容易的。
干杯们,希望客户对提案感到满意。
答案 0 :(得分:1)
这是我的2c。
不要更新原始字段。如果您有可能想要将其回滚,那么您会遇到大量问题。创建使用新值更新的新字段。如果要引用此字段,可以执行此操作。当你想引用另一个字段时,你可以这样做。
更一般地说,对于您想要“修复”的任何字段,这都是一个很好的策略。您可以在以后改进您正在“修复”的内容,如果您已覆盖原始数据,则无法完成。始终保留原始数据,然后您可以根据需要重复使用它。
如果您要做的就是删除第一个空格之前的所有内容,那么以下内容将起作用:
update the_table
set p_id = substr(p_id, instr(p_id, ' ') + 1);
答案 1 :(得分:1)
作为一般规则,请勿存储推断的数据。
只需在客户端代码中,或在VIEW或虚拟列(Oracle 11)中为字段添加前缀,而无需修改原始值。由于您尚未对其进行修改,因此无需回滚。
答案 2 :(得分:0)
如果您正在询问如何简单地执行此操作,请将前缀修剪至空格并恢复原始值。如果你正在寻找一个更好的选择,那么我会说创建另一个像“old_p_id”的列,然后将旧的列推入其中。如果要回滚,可以随时使用old_p_id更新p_id。
+----------------------+
¦ p_id ¦ old_p_id ¦
¦-----------+----------¦
¦ X12 19680 ¦ 19680 ¦
¦ X13 19681 ¦ 19681 ¦
+----------------------+
答案 3 :(得分:0)
您使用的是哪个版本的Oracle?如果是Oracle 11g,你可以使用虚拟列!
alter table table1
add new_column as p_number || ' ' || p_id;
我假设您的所有列都是varchar类型。
使用这种方法,您将不得不更新客户端代码以引用新列。