通过从不同列中选择随机值来更新列

Rak*_*air 3 sql oracle

我有一个具有以下结构的表

+----+---+
| A  | B | 
+----+---+
|  1 |   |
|  2 |   |
|  3 |   |
|  4 |   |
|  5 |   |
|  6 |   | 
+----+---+
Run Code Online (Sandbox Code Playgroud)

B我需要通过从 column 中随机选择任何元素来更新列A

我使用查询从列中获取随机值A

SELECT A FROM
( SELECT A FROM MyTable
ORDER BY dbms_random.value )
WHERE rownum = 1
Run Code Online (Sandbox Code Playgroud)

然后我尝试这个查询来更新值B

UPDATE MyTable SET B=( SELECT A FROM
( SELECT A FROM MyTable
ORDER BY dbms_random.value )
WHERE rownum = 1);
Run Code Online (Sandbox Code Playgroud)

但这会将所有行设置为相同的值。但我需要为每一行设置随机值。

我怎样才能实现这一目标Oracle 11g

Gor*_*off 5

这是您正在尝试的查询:

UPDATE MyTable
    SET B = (SELECT A
             FROM (SELECT A FROM MyTable ORDER BY dbms_random.value)
             WHERE rownum = 1
            );
Run Code Online (Sandbox Code Playgroud)

我认为问题在于优化器太聪明了——它看到子查询并只执行一次。在其他数据库中,可以通过使用相关子句来解决此问题。但是,Oracle 不允许在子查询中嵌套超过一层。

因此,这里有一个稍微不同的表述:

UPDATE MyTable t
    SET B = (SELECT MAX(A) KEEP (DENSE_RANK FIRST ORDER BY dbms_random.value)
             FROM MyTable t2
             WHERE t2.A <> t.A  -- This is an arbitrary correlation clause to ensure that the subquery runs for each row
            );
Run Code Online (Sandbox Code Playgroud)