2016-08-23 3 views
1

zu stoppen ich Dummy-Daten in der Datenbank zu Testzwecken einzusetzen versuchte, und die Beziehung zu passen Ich brauche alle IDs von einer Tabelle zu aktualisieren, entsprechend den Werten eines anderen.Force-SQL-Server-Caching subquery

Die Abfrage führte ich versuche, ist,

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

aber BatchID von LG ist gefüllt mit nur einem Wert scheint seine Caching Ergebnisse der inneren Abfrage, wie es zu zwingen, nicht Caching von Unterabfragen zu tun.

+3

Die Unterabfrage in dieser Abfrage nur einmal ausgeführt wird, weil es keine Korrelation zwischen dem aktualisierte Tabelle und die Unterabfrage. Sie werden ein anderes Konstrukt verwenden müssen. –

+0

@DanGuzman ich mit innerer Abfrage versuchte SELECT TOP 1 BatchID von Charge wo LG.BatchID! = Batch.BatchID ORDER BY NEWID() ', aber immer noch alle Zeilen mit dem gleichen Wert aktualisiert. – Shubanker

+0

'Update LG gesetzt BatchID = t2.BatchID von LG inneren Batch T2 auf T2 verbinden. ?? = LG. ?? ' – artm

Antwort

1

Sie MERGE und ROW_NUMBER verwenden können() Tabellen zu machen korreliert

;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 Ich habe diese Tabellen:

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') 

nach der Zusammenführung oben läuft ich bekommen:

BatchID SomeString 
7  a 
8  b 
9  c 
10  d 

In LG Tabelle

+0

Danke, es hat den Job, lernte heute etwas neues lernen :) – Shubanker

0

können Sie auf diese Weise

update table1 set id = (select newid()) 

verwenden Wenn das Caching von newid ist(), dann können Sie rand() verwenden

+0

die Antwort scheint irrelevant zu sein – Shubanker