1

我有两张桌子:

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) 中添加的行,我想复制它们的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] 列上都有一个索引,并且您只想使用表 2 中的数据更新表 1 中的现有行,并且两个表之间的 [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

我们在我们的暂存数据库中使用它,所以速度不是那么大的问题。对 1300 万条记录的粗略测试表明,这在我们的硬件 (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);

删除后第二个查询看起来没问题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 回答