2016-09-03 36 views
2

选择随机值更新列我有具有以下结构的通过从不同的列

+----+---+ 
| A | B | 
+----+---+ 
| 1 | | 
| 2 | | 
| 3 | | 
| 4 | | 
| 5 | | 
| 6 | | 
+----+---+ 

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

我用查询从列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中实现此目的?

回答

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 
      ); 
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   | 
+-----------+-------------+