【问题标题】:How to update record which is duplicated PL/SQL in procedure如何更新过程中重复的 PL/SQL 记录
【发布时间】:2013-01-26 03:11:53
【问题描述】:

我有一个名为 sales_staff_08 的表,名字、姓氏、用户名是 3 列。

用户名使用名字和姓氏连接。

因为它可能会被复制。因此,我想通过添加一些数字来避免。

当前表

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;
 /

【问题讨论】:

  • 我认为你必须改变你的表结构,主要是为每个名称添加唯一的 id,以便使用相应的 id 来更新用户名,而不是 rec_cur_concate.username。或者我认为有一种可能的方式使用触发器。
  • 其实我有 sales_staff_id 作为主键。

标签: oracle plsql duplicates


【解决方案1】:

你可以用一个命令来做到这一点:

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;

Here is a sqlfiddle demo

正如@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
)

Here is another sqlfiddle

【讨论】:

  • @Plouf,那是因为我不知道如何在 简单 更新中做到这一点,只有非常不简单 更新,恕我直言合并更好,因为查询保持干净。不管怎样,既然你挑战了,我会更新我的答案
  • @Plouf,实际上有 - update 的内部视图需要为每个 d.rowid 计算,因为我使用了 window function (row_number()),但在 @987654328 @我希望它找到一次 rsultset 并将其加入到 d 的结果中
  • 我试过了,但它不起作用。 s 是什么?我的表实际上有 sales_staff_id,我应该将其替换为 rowid 吗?
  • @TommyNguyenDuc,如果它是一个唯一的键而不是你可以(应该)替换的,什么不起作用 - 你得到什么而不是正确的结果?
  • @A.B.Cade:谢谢你的好意。我通过取 sales_staff_id 的最后 2 位数字使其工作:) :)
【解决方案2】:

A.B.Cade 的答案更可靠。首先,如果有数百万行,合并和更新会更快。因为在第一种情况下,您同时使用 plsql 引擎和 sql 引擎进行操作。这意味着在plsql引擎的每个循环中,它都会调用sql引擎。在第二种情况下,它将使用更快的完全独立的 sql 引擎。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多