2012-10-25 5 views
11

İki tablom var. Table 1'un yaklaşık 80 satırı vardır ve Table 2 yaklaşık 10 milyona sahiptir.SQL Server'da güncelleştirme durumundaki rasgele kayıtlarla tabloyu güncelleyin?

Table 2'daki tüm satırları Table 1 rastgele bir sırayla güncelleştirmek istiyorum. Tüm satırlar için aynı satırı istemiyorum. Table 2'u güncellemek ve güncellemekte olduğu her satır için rastgele bir değer seçmek mümkün mü?

Denediğim şey bu, ancak her satırda aynı değeri koyar.

update member_info_test 
set hostessid = (SELECT TOP 1 hostessId FROM hostess_test ORDER BY NEWID()) 

** Bu yazdığım en tuhaf sorgunun biri olduğunu düşünüyorum,

+0

Bu doğru yönde işaret eder: http://stackoverflow.com/questions/19412/how-to-request-a -random-row-in-sql – Landjea

+2

Aynı kayıt için bir tane istemiyor musun? İlk tablo 80 olduğunda ve güncellemek istediğiniz tablo 10M kayıtları olduğunda zor. –

+0

Her kayıt için aynı kayıtlar iyi değil. Sadece bir tablodan 80 kaydı kullanmasını istiyorum – chobo

cevap

15

Tamam Düzenleyen ve bu yavaş korkunç olacak olduğunu düşünüyorum.

(ve Lamak en kadar) bu anahtarı dış korelasyon

olduğunu

with toupdate as (
     select (select top . . . hostessId from hostess_test where mit.hostessId = mit.hostessId order by newid()) as newval, 
      mit.* 
     from member_info_test mit 
    ) 
update toupdate 
    set hostessid = newval; 
:

UPDATE A 
SET A.hostessid = B.hostessId 
FROM member_info_test A 
CROSS APPLY (SELECT TOP 1 hostessId 
      FROM hostess_test 
      WHERE A.somecolumn = A.somecolumn 
      ORDER BY NEWID()) B 
+1

Değerlerin hepsi aynı :( – chobo

+1

@chobo - Gerçekten ?, Bunu örnek verilerle test ettim ve iyi çalıştı.Ama farklı değerleri elde etmek için, "WHERE A.somecolumn = A.somecolumn" zorunluydu – Lamak

+0

Ben ' neden sizin için işe yaradığını biliyorum, ama her satırda aynı değerleri alıyorum – chobo

1

Ben (en azından, with bölümü yapar) bu işe yarayacak: Ama denemek alt sorgu. Bu, optimize edicinin her satır için sorguyu çalıştırması için ikna etmektir. Bunun neden işe yaradığını ve diğer versiyonun neden olacağını bilmiyorum. İşte

+0

Eğer 1 'i koyarsanız. . .', o zaman çalışması gerekir. Bu kodu neden ekleyemediğim hakkında bir fikrin var mı? –

+0

Bkz. [Bu Connect öğesi] (http://connect.microsoft.com/SQLServer/feedback/details/350485/bug-with-newid-and-table-expressions). –

+0

Bu, SQL2012'de benim için iyi çalıştı; Bununla birlikte, 'güncelleme' kısmındaki 'mit' takma adlarını çıkarmam gerekiyordu. Hepsi bir arada, bir kerelik bir sorun için iyi, mantıklı, bir çözüm. –

0

i kullanarak sona erdi budur:

EnvelopeInformation sizin Tablo olurdu 2

PaymentAccountDropDown sizin Tablo 1 olacaktır (benim durumumda ben 3 öğe vardı) - değişikliğini 3 80 için USECASE.

;WITH cteTable1 AS (
    SELECT 
     ROW_NUMBER() OVER (ORDER BY NEWID()) AS n, 
     PaymentAccountDropDown_Id 
    FROM EnvelopeInformation 
    ), 
cteTable2 AS (
    SELECT 
     ROW_NUMBER() OVER (ORDER BY NEWID()) AS n, 
     t21.Id 
    FROM PaymentAccountDropDown t21 
    ) 
UPDATE cteTable1 
    SET PaymentAccountDropDown_Id = (
     SELECT Id 
     FROM cteTable2 
     WHERE (cteTable1.n % 3) + 1 = cteTable2.n 
) 

referans: http://social.technet.microsoft.com/Forums/sqlserver/pt-BR/f58c3bf8-e6b7-4cf5-9466-7027164afdc0/updating-multiple-rows-with-random-values-from-another-table

0

Update Table with Random fields

UPDATE p 
    SET p.City= b.City 
    FROM Person p 
    CROSS APPLY (SELECT TOP 1 City 
       FROM z.CityStateZip 
       WHERE p.SomeKey = p.SomeKey and -- ... the magic! ↓↓↓ 
       Id = (Select ABS(Checksum(NewID()) % (Select count(*) from z.CityStateZip)))) b