2016-08-23 5 views
1

Я пытался вставить фиктивные данные в базу данных для целей тестирования и сопоставить отношения Мне нужно обновить все идентификаторы одной таблицы в соответствии со значениями другого.Force sql server, чтобы остановить кэширование подзапроса

Запрос Я пытаюсь выполнить это

update LG set BatchID=(SELECT TOP 1 BatchID FROM Batch 
ORDER BY NEWID()) 

но BatchID от LG заполнена только одна ценность, кажется, его результаты кэширования внутреннего запроса, как заставить его не делать кэширование подзапросов.

+3

подзапрос выполняется только один раз в этом запросе, потому что нет никакой корреляции между обновленную таблицу и подзапрос. Вам понадобится использовать другую конструкцию. –

+0

@DanGuzman Я попытался с внутренним запросом 'SELECT TOP 1 BatchID FROM Batch, где LG.BatchID! = Batch.BatchID ORDER BY NEWID()', но все же все строки обновляются с одинаковым значением. – Shubanker

+0

'обновление LG set BatchID = t2.BatchID FROM LG внутренняя партия присоединения t2 на t2. ?? = LG. ?? ' – artm

ответ

1

Вы можете использовать MERGE и ROW_NUMBER(), чтобы сделать таблицы коррелируют

;WITH LG_cte AS (
SELECT *, 
     ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as rn 
FROM LG 
), Batch_cte AS (
SELECT *, 
     ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as rn 
FROM Batch 
) 

MERGE LG_cte as lg 
USING Batch_cte as b 
ON lg.rn = b.rn 
WHEN MATCHED THEN 
    UPDATE SET BatchID = b.BatchID; 

Fe Я получил эти таблицы:

CREATE TABLE LG (
    BatchID int, 
    SomeString nvarchar(max) 
) 
CREATE TABLE Batch (
    BatchID int, 
    SomeString1 nvarchar(max) 
) 

INSERT INTO LG VALUES 
(1,'a'), 
(2,'b'), 
(3,'c'), 
(4,'d') 

INSERT INTO Batch VALUES 
(7,'e'), 
(8,'f'), 
(9,'g'), 
(10,'h') 

После выполнения слияния выше я получаю:

BatchID SomeString 
7  a 
8  b 
9  c 
10  d 

В LG таблице

+0

Спасибо, что он сделал работу, научился чему-то новому сегодня :) – Shubanker

0

Вы можете использовать этот способ

update table1 set id = (select newid()) 

Если кэширование NEWID(), то вы можете использовать RAND()

+0

ответ кажется несущественным – Shubanker

Смежные вопросы