Oracle从另一个表随机更新

时间:2018-10-09 12:02:51

标签: oracle oracle11g

我在表1中有一些字段要用表2中某些字段的随机值进行更新。

我必须随机进入table2的行,并用table2的相同行值更新table1的每一行。

这是我的SQL代码,但不起作用。

update owner.table1 t1
  set (t1.adress1, t1.zip_code, t1.town) = (select t2.adress, t2.zip_code, t2.town 
                                            from table1 t2 
                                            where id = trunc(dbms_random.value(1,20000)))

结果:所有行都更新为相同的值,例如表2行上没有随机数

1 个答案:

答案 0 :(得分:0)

切换到解析ROW_NUMBER函数怎么样?它并不会真正创建 random 值,但可能足够好。

这里是一个示例:首先,创建测试表并插入一些数据:

SQL> create table t1 (id number,address varchar2(20), town varchar2(10));

Table created.

SQL> create table t2 (id number, address varchar2(20), town varchar2(10));

Table created.

SQL> insert into t1
  2    select 1, 'Ilica 20', 'Zagreb' from dual union all
  3    select 2, 'Petrinjska 30', 'Sisak' from dual union all
  4    select 3, 'Stradun 12', 'Dubrovnik' from dual;

3 rows created.

SQL> insert into t2
  2    select 1, 'Pavelinska 15', 'Koprivnica' from dual union all
  3    select 2, 'Baščaršija 11', 'Sarajevo' from dual union all
  4    select 3, 'Riva 22', 'Split' from dual;

3 rows created.

SQL> select * From t1 order by id;

        ID ADDRESS              TOWN
---------- -------------------- ----------
         1 Ilica 20             Zagreb
         2 Petrinjska 30        Sisak
         3 Stradun 12           Dubrovnik

SQL> select * From t2 order by id;

        ID ADDRESS              TOWN
---------- -------------------- ----------
         1 Pavelinska 15        Koprivnica
         2 Baščaršija 11        Sarajevo
         3 Riva 22              Split

使用t2中的行更新t1:

SQL> update t1 set
  2    (t1.address, t1.town) =
  3    (select x.address, x.town
  4     from (select row_number() over (order by address) id, t2.address, t2.town
  5           from t2
  6          ) x
  7     where x.id = t1.id);

3 rows updated.

SQL> select * From t1 order by id;

        ID ADDRESS              TOWN
---------- -------------------- ----------
         1 Baščaršija 11        Sarajevo
         2 Pavelinska 15        Koprivnica
         3 Riva 22              Split

SQL>