我有一个具有以下结构的表
+----+---+
| 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?
这是您正在尝试的查询:
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)