2016-03-23 14 views
2
update table1 
set firstname = (select top 1 firstname from table2 order by NEWID()) 

Bu, yalnızca tüm tabloları için table1.firstname değerini aynı değere ayarlar. Bunu yapmanın mümkün olduğunu biliyorum, ancak çevrimiçi gördüğüm her şey, her iki tabloda da aynı satır sayısını bekler (ya da en azından tablo1'de daha büyük bir miktar). Tablo1’de 200.000 kayıt var, 200’ümde 200’üm var. Satır sayımları kapalı olduğunda table1.firstname tablos2.firstname'den rasgele bir değere nasıl ayarlayabilirim?Alanı başka bir tablodan rastgele bir değere ayarla

+0

tablo1 birincil anahtarı olan nedir? – Lamak

+1

sağ taraftaki ifadeniz sadece bir kez değerlendirilir, sınamanın testteki – TheGameiswar

cevap

4
DECLARE @t1 TABLE (a INT) 
DECLARE @t2 TABLE (b INT, c INT) 

INSERT INTO @t1(a) 
VALUES (0), (1), (2), (3), (4), (5) 

INSERT INTO @t2(b) 
VALUES (0), (1), (2) 

UPDATE t2 
SET c = t1.a 
FROM @t2 t2 
CROSS APPLY (
    SELECT TOP(1) t1.a 
    FROM @t1 t1 
    WHERE t2.b IS NOT NULL -- any calculations for t2 columns 
    ORDER BY NEWID() 
) t1 

SELECT * FROM @t2 

Çıktı -

b   c 
----------- ----------- 
0   5 
1   1 
2   0 
+0

cevabı gibi bir ilişki kurması için bir yol aramanız gerekir, sadece bu filtrenin sütununu kullanamazsınız: 'WHERE t2.b IS NOT NULL', Benzersiz bir – Lamak

+1

@ Lamak üzerinde olmalı. Böyle bir alanın mevcut olmaması durumunda ROW_NUMBER kodunu kullanabileceğini düşünüyorum. –

+2

@GiorgosBetsos emin, bu soruyu çalıştırmadan önce op bunun farkında olduğunu bir konuya işaret ediyorum – Lamak

İlgili konular