2016-08-23 31 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