我有一个包含以下结构的表
+----+---+
| A | B |
+----+---+
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
+----+---+
我需要通过从B
列中随机选择任何元素来更新列A
。
我使用查询从列A
获取随机值。
SELECT A FROM
( SELECT A FROM MyTable
ORDER BY dbms_random.value )
WHERE rownum = 1
然后我尝试了此查询来更新值B
UPDATE MyTable SET B=( SELECT A FROM
( SELECT A FROM MyTable
ORDER BY dbms_random.value )
WHERE rownum = 1);
但是这会将所有行设置为相同的值。但是我需要用随机值设置每一行。
如何在Oracle 11g
中实现这一目标?
答案 0 :(得分:3)
这是您正在尝试的查询:
UPDATE MyTable
SET B = (SELECT A
FROM (SELECT A FROM MyTable ORDER BY dbms_random.value)
WHERE rownum = 1
);
我认为问题在于优化器太聪明了 - 它只看到子查询并执行一次。在其他数据库中,可以使用关联子句来解决此问题。但是,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
);
答案 1 :(得分:0)
drop table Random_numbers;
create table random_numbers (
Product_code VARCHAR2(40),
Item_code VARCHAR2(40)
);
insert into random_numbers(Product_code) values(1);
insert into random_numbers(Product_code) values(2);
insert into random_numbers(Product_code) values(3);
insert into RANDOM_NUMBERS
(ITEM_CODE)
select RANDOM_NUMBERS.PRODUCT_CODE from RANDOM_NUMBERS ORDER BY
dbms_random.value;
我认为这会对你有所帮助。 输出:
+-----------+-------------+
|ITEM_CODE | Product_code|
|1 | 2 |
|2 | 3 |
|3 | 1 |
+-----------+-------------+