1

私は2つのテーブルを持っています:

Table1:

RulesVectorID(nullable, primary),Weight,IsDeleted

Table2:

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

私は2つのことをしたい:

  1. Idtable1 のすべての行に割り当てるwhere RulesVectorID ==null

    私はこれを試しました:

    UPDATE myTable1
    SET RulesVectorID = SELECT MAX(RulesVectorID) + 1 FROM myTable1,
    WHERE RulesVectorID IS NULL
    
  2. 手順 (1) で追加した行に、そのWeight, IsDeleted列をコピーして 1 を追加したい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))
    

それを行うためのよりクリーンな方法はありますか?

4

2 に答える 2

1

各テーブルの[uniqueID]列にインデックスがあり、テーブル1の既存の行をテーブル2のデータで更新したい場合、[uniqueID]は2つのテーブル間で同じであると想定されるため、次のことを試すことができます。

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

これをステージングデータベースで使用するため、速度はそれほど重要ではありません。1,300万レコードのエンベロープテストの裏側では、ハードウェア(YMMV)でこれに約15秒かかることが示されています。

于 2012-10-16T14:16:22.540 に答える
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);

ドロップすると、2番目のクエリは問題ないように見えますvalues()

insert into myTable2 (Weight,IsDeleted,NumberOfOffers,RulesVectorID) 
select Weight,IsDeleted,1,RulesVectorID 
from myTable1 
where myTable1.RulesVectorID not in (select RulesVectorID from myTable2)
于 2012-10-16T11:48:55.837 に答える