我试图在数据库中插入虚拟数据用于测试目的并匹配关系,我需要根据另一个表的值更新一个表的所有id。强制sql服务器停止缓存子查询
我想执行的查询是
update LG set BatchID=(SELECT TOP 1 BatchID FROM Batch
ORDER BY NEWID())
,但LG的BatchID充满只有一个价值似乎内层查询其缓存的结果,如何迫使它不这样做子查询的高速缓存。
我试图在数据库中插入虚拟数据用于测试目的并匹配关系,我需要根据另一个表的值更新一个表的所有id。强制sql服务器停止缓存子查询
我想执行的查询是
update LG set BatchID=(SELECT TOP 1 BatchID FROM Batch
ORDER BY NEWID())
,但LG的BatchID充满只有一个价值似乎内层查询其缓存的结果,如何迫使它不这样做子查询的高速缓存。
您可以使用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
表
感谢它做了这项工作,今天学习了一些新东西:) – Shubanker
子查询在此查询只执行一次,因为在无相关性更新的表和子查询。你需要使用不同的构造。 –
@DanGuzman我试着用内部查询'SELECT TOP 1 BatchID FROM Batch where LG.BatchID!= Batch.BatchID ORDER BY NEWID()'但仍然所有的行都用相同的值更新。 – Shubanker
'更新LG集BatchID = t2.BatchID FROM t2 t2上的内部连接批t2。 = LG。' – artm