2012-10-16 21 views
1

我有兩個表更新從表2的記錄表1:如何使用T-SQL

Table1

RulesVectorID(nullable, primary),Weight,IsDeleted 

Table2

RulesVectorID(forigen) , Weight,IsDeleted, NumberOfOffers, other fields... 

我想做的事情拖的事情:

  1. 分配Id所有行table1中where RulesVectorID ==null

    我嘗試這樣做:

    UPDATE myTable1 
    SET RulesVectorID = SELECT MAX(RulesVectorID) + 1 FROM myTable1, 
    WHERE RulesVectorID IS NULL 
    
  2. 要在步驟添加的行(1)我要1複製他們Weight, IsDeleted列,並添加到他們的NumberOfOffers

    我試過這個:

    INSERT INTO myTable2 (Weight, IsDeleted, NumberOfOffers, RulesVectorID) 
    VALUES (
        SELECT Weight, IsDeleted, 1, RulesVectorID 
        FROM myTable1 
        WHERE myTable1.RulesVectorID NOT IN (SELECT RulesVectorID FROM myTable2)) 
    

有沒有更乾淨的方法來做到這一點?

+0

通過詢問是否有更乾淨的方式來做到這一點,這是否意味着你有什麼作品?如果有效,請使用它。這很合理。在修復表格後,將RulesVectorID更改爲自動增量,並將其設置爲主鍵,以使其不能爲空。 –

回答

0
;with t as (
select *, rn=row_number() over (order by weight) 
from mytable1 
where RulesVectorID is null) 
update t set RulesVectorID = rn + isnull((Select max(RulesVectorID) from myTable1),0); 

第二個查詢看起來不錯,一旦你刪除values()

insert into myTable2 (Weight,IsDeleted,NumberOfOffers,RulesVectorID) 
select Weight,IsDeleted,1,RulesVectorID 
from myTable1 
where myTable1.RulesVectorID not in (select RulesVectorID from myTable2) 
+0

爲什麼需要「按重量排序」? –

+0

爲什麼'values()'可以嗎? –

1

鑑於您對[UNIQUEID]列的索引在每個表,你只是想更新表1中的數據存在行表2和[UNIQUEID]應該是兩個表之間的相同,你可以嘗試以下方法:

UPDATE Table1 
SET Table1.stfips=Table2.NEWstfips, 
    Table1.areatype=Table2.NEWareatype, 
    Table1.area=Table2.NEWarea 
FROM Table2 
JOIN Table1 
    ON Table1.uniqueid=Table2.uniqueid 

我們在臨時數據庫上使用該所以速度並沒有很大的共同的ncern。在對1300萬條記錄進行信封測試後發現,我們的硬件(YMMV)大約需要15秒。