2016-08-23 32 views
1

我试图在数据库中插入虚拟数据用于测试目的并匹配关系,我需要根据另一个表的值更新一个表的所有id。强制sql服务器停止缓存子查询

我想执行的查询是

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

,但LG的BatchID充满只有一个价值似乎内层查询其缓存的结果,如何迫使它不这样做子查询的高速缓存。

+3

子查询在此查询只执行一次,因为在无相关性更新的表和子查询。你需要使用不同的构造。 –

+0

@DanGuzman我试着用内部查询'SELECT TOP 1 BatchID FROM Batch where LG.BatchID!= Batch.BatchID ORDER BY NEWID()'但仍然所有的行都用相同的值更新。 – Shubanker

+0

'更新LG集BatchID = t2.BatchID FROM t2 t2上的内部连接批t2。 = LG。' – artm

回答

1

您可以使用MERGEROW_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(缓存),那么你可以使用兰特()

+0

答案似乎是不相关的 – Shubanker