У меня есть таблица со столбцом, который содержит некоторые значения.Я хочу заменить все существующие значения случайными значениями из другой таблицы (но только существующие - так что WHERE COL1 IS NOT NULL
).Невозможно сопоставить две таблицы.Каждое из случайных значений должно быть различным (ну ... если только они случайно не одинаковы, в этом случае это нормально).
Например:
CREATE TABLE T1 (ID NUMBER(11,0), COL1 VARCHAR2(20));
CREATE TABLE T2 (COL2 VARCHAR2(20));
INSERT INTO T1 VALUES (1, NULL);
INSERT INTO T1 VALUES (54, NULL);
INSERT INTO T1 VALUES (941, 'Some text');
INSERT INTO T1 VALUES (251, NULL);
INSERT INTO T1 VALUES (352, 'Some other text');
INSERT INTO T1 VALUES (354, NULL);
INSERT INTO T2 VALUES ('Val1');
INSERT INTO T2 VALUES ('Val2');
INSERT INTO T2 VALUES ('Val3');
INSERT INTO T2 VALUES ('Val4');
INSERT INTO T2 VALUES ('Val5');
INSERT INTO T2 VALUES ('Val6');
INSERT INTO T2 VALUES ('Val7');
Я пробовалнесколько вещей и искали этот сайт для ответов.Ответы, которые я нашел, похоже, требуют, чтобы между этими двумя таблицами была некоторая корреляция.Много примеров для SQL Server.В любом случае я попробовал несколько, но я не могу получить подход MERGE
или CROSS APPLY
к работе (я ценю, что это, скорее всего, моя неудача ...).
ЕдинственныйУ меня есть решение, которое на самом деле работает на данный момент:
BEGIN
FOR X IN (
SELECT ID FROM T1 WHERE COL1 IS NOT NULL
)
LOOP
UPDATE T1 SET COL1 = (
SELECT COL2 FROM (
SELECT COL2 FROM T2 ORDER BY SYS_GUID()
) WHERE ROWNUM = 1
)
WHERE T1.ID = X.ID;
END LOOP;
END;
/
Это дает (желаемый) результат:
SELECT * FROM T1;
ID COL1
---------------------------
1
54
941 Val3
251
352 Val7
354
(значения COL1 оба являются случайными каждый раз, когда я запускаюцикл).
... Но я знаю, что должен быть основанным на множестве способом достижения этого ... верно?