lundi 12 août 2019

How to update data by select random row value from another table

I have three tables A, B, C, and I want to randomly take a row from the col_b column of the table B then update it to the table A. Table C is the subtable of Table B, which is used to filter the data of Table B. Here is my sql statement:

update a a
   set a.col_a_b =
       (select t.col_b
          from (select a1.col_a, b1.col_b, a1.rn_var
                  from (select a0.col_a, TRUNC(dbms_random.value(1, 6)) rn_var
                          from a a0) a1
                  left join (select b.col_b, rownum rn
                              from b b
                             where exists (select 1
                                      from c c
                                     where b.id = c.col_b_id
                                       and c.col_c = 'c1')) b1
                    on a1.rn_var = b1.rn) t
         where t.col_a = a.col_a);

I found a strange phenomenon:

  • If I remove a1.rn_var (line from (select a1.col_a, b1.col_b, a1.rn_var), it doesn't work as my expected

  • On the basis of the above, if I replace exists with left join (or join), the result is the same

  • If I reomve both a1.rn_var and exists, it will work fine.

I know there may be a better way to implement it, but who can tell me why?




Aucun commentaire:

Enregistrer un commentaire