通过从其他列

时间:2016-09-03 09:56:15

标签: sql oracle

我有一个包含以下结构的表

+----+---+
| 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中实现这一目标?

2 个答案:

答案 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          |
+-----------+-------------+