我有一张名为sales_staff_08的表,姓名,用户名为3列。
使用firstname和surname连接username。
因为它可能是重复的。因此,我想通过添加一些数字来避免。
当前表格
USERNAME
----------
JOHSMITH1
TOMNGUYE1
STEREDMO1
BOBJOHN1
CARJONES1
DANCREIG1
STEREDMO1
TOMNGUYE1
我想更新重复的RECORD,它应该如下所示:
USERNAME
----------
JOHSMITH1
TOMNGUYE1
STEREDMO1
BOBJOHN1
CARJONES1
DANCREIG1
STEREDMO2
TOMNGUYE2
我第一次尝试更新记录
CREATE OR REPLACE PROCEDURE proc_concate_names IS
vc_username VARCHAR(25);
v_number NUMBER (2) := 1;
CURSOR cur_concate_username IS
SELECT firstname, surname, username FROM sales_staff_08;
BEGIN
FOR rec_cur_concate IN cur_concate_username
LOOP
vc_username := rec_cur_concate.firstname || rec_cur_concate.surname || v_number;
UPDATE sales_staff_08 ss
SET username = vc_username
WHERE ss.username = rec_cur_concate.username;
END LOOP;
END proc_concate_names;
/
答案 0 :(得分:2)
您可以使用一个命令执行此操作:
merge into sales_staff_08 d
using (select firstname ||surname || row_number()
over (partition by username order by firstname) un, rowid
from sales_staff_08 ) s
on (d.rowid = s.rowid)
when matched then update set d.username = s.un;
正如@Plouf所述,这也可以作为更新命令来完成:
update sales_staff_08 d
set d.username = (
select un from (
select firstname ||surname || row_number()
over (partition by firstname, surname order by firstname) un
from sales_staff_08
) s
where s.rowid = d.rowid
)
答案 1 :(得分:2)
A.B.Cade答案更可靠。首先,如果有数百万行,合并和更新将更快地运行。因为在第一种情况下,您使用plsql引擎和sql引擎进行操作。它意味着在plsql引擎的每个循环中,它将调用sql引擎。在第二种情况下,它将使用完全独立的sql引擎,这是更快。