Oracle 如何通过从另一个表中选择随机行值来更新数据

Oracle 如何通过从另一个表中选择随机行值来更新数据,oracle,select,random,sql-update,Oracle,Select,Random,Sql Update,我有三个表A、B、C,我想从表B的Colu_B列中随机抽取一行,然后将其更新到表A。表C是表B的子表,用于过滤表B的数据。 以下是我的sql语句: update a a set a.col_a_b = (select t.col_b from (select a1.col_a, b1.col_b, a1.rn_var -- the number 6 is because I only have 6 rows of dat

我有三个表A、B、C,我想从表B的Colu_B列中随机抽取一行,然后将其更新到表A。表C是表B的子表,用于过滤表B的数据。 以下是我的sql语句:

update a a
   set a.col_a_b =
       (select t.col_b
          from (select a1.col_a, b1.col_b, a1.rn_var
                  -- the number 6 is because I only have 6 rows of data,
                  -- and the real situation should be the total number of conditions in table b
                  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);
我发现了一个奇怪的现象:

如果我从选择a1.col_a、b1.col_b、a1.rn_var中删除a1.rn_var行,它将无法按预期工作

基于以上,如果我用left join或join替换exists,结果是相同的

如果我重新调用a1.rn_var和exists,它将正常工作

我知道可能有更好的方法来实施,但谁能告诉我为什么

更新:

实际上,这是由以下sql引起的:

select a1.col_a, b1.col_b -- remove 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
 -- this is for better display of results
 where a1.col_a = 'a1';
在上面的sql中,我可能会得到多行数据,或者b1列为空,如下所示:

a1  b1
a1  b2
a1  b4
------------------------------------------------
a1     -- here is null
此外,列a1.col_a的每个值都是相同的,我的意思是,如果值a1有多行,那么值a2等具有相同的结果,如下所示:

a1  b2
a1  b4
a1  b5
a2  b2
a2  b4
a2  b5
...

您可以使用一个随机数并按该随机数排序以获得随机记录

我更喜欢使用以下技巧:

UPDATE A A
SET
    A.COL_A_B = (
        SELECT
            COL_B
        FROM
            (
                SELECT
                    COL_B,
                    TRUNC(DBMS_RANDOM.VALUE(1, COUNT(1) OVER())) RANDOM_NUMBER  --GENERATES RANDOM NUMBER
                FROM
                    (
                        SELECT DISTINCT
                            B.COL_B -- FETCHING DISTINCT RESULT
                        FROM
                            B B
                            -- EXISTS IS CONVERTED INTO JOIN
                            JOIN C C ON ( B.ID = C.COL_B_ID 
                                          AND C.COL_C = 'c1' )
                    )
                ORDER BY
                    RANDOM_NUMBER -- ORDERING IS DONE BY RANDOM NUMBER
                FETCH FIRST ROWS ONLY -- FETCHING ONLY FIRST ROW FROM ORDERED RECORDS
            )
    )

干杯

是的,这是我的工作。如果你能告诉我我描述的问题的原因,我会更高兴。首先,你的随机数rn_var只能包含6个数字,在你的例子中,只有表b中的前6个值被选取。关于更多细节,你需要告诉我当你删除问题中提到的列时实际结果是什么。这是我的错,我更新了我的问题并添加了一些实际结果的示例。是的,分析了数据。这是因为您只使用了6个随机数,在我的示例中,我使用了表b的行数作为随机数。是的,您是对的。我的想法是首先计算表b中的行数,然后取随机数。这是错的吗?