我試圖在數據庫中插入虛擬數據用於測試目的並匹配關係,我需要根據另一個表的值更新一個表的所有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