2016-09-03 14 views
2

Auswählen habe ich eine Tabelle mit der folgenden Struktureine Spalte aktualisieren, indem Zufallswert aus einer anderen Spalte

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

I durch eines der Element zufällig aus Spalte A Auswählen der Spalte B aktualisieren müssen.

Ich verwendete die Abfrage, um einen zufälligen Wert aus Spalte A zu erhalten.

SELECT A FROM 
(SELECT A FROM MyTable 
ORDER BY dbms_random.value) 
WHERE rownum = 1 

Dann habe ich versucht, diese Abfrage den Wert B

UPDATE MyTable SET B=(SELECT A FROM 
(SELECT A FROM MyTable 
ORDER BY dbms_random.value) 
WHERE rownum = 1); 

Aber dies wird gesetzt, alle Zeilen mit dem gleichen Wert zu aktualisieren. Aber ich brauche jede Zeile mit zufälligen Werten zu setzen.

Wie erreiche ich das in Oracle 11g?

Antwort

3

Dies ist die Abfrage, die Sie versuchen:

UPDATE MyTable 
    SET B = (SELECT A 
      FROM (SELECT A FROM MyTable ORDER BY dbms_random.value) 
      WHERE rownum = 1 
      ); 

ich glaube, das Problem ist, dass das Optimierungsprogramm zu schlau ist - es sieht die Unterabfrage und führt sie nur ein einziges Mal. In anderen Datenbanken kann dies mithilfe einer Korrelationsklausel behoben werden. Aber Oracle erlaubt das nicht in Unterabfragen, die mehr als eine Ebene verschachtelt sind.

So ist hier eine etwas andere Formulierung:

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; 

Ich denke, das wird Ihnen helfen. Ausgabe:

+-----------+-------------+ 
|ITEM_CODE | Product_code| 
|1   | 2   | 
|2   | 3   | 
|3   | 1   | 
+-----------+-------------+ 
Verwandte Themen