none
sql查询之数据复制难题! RRS feed

  • 问题

  • A表AID,EleID,PAID,BID,OTH
    B表BID,EleID,OTH

    A表的AID和PAID为树状结构,A表的BID和B表的BID存在主外键关联

    复制两表中EleID为1的数据到自身的表中,复制数据的EleID改变为3

    AID和BID为主键自增列

    复制结果要求保持新的关系建立

    示例数据
    A表
    AID ,EleID,PAID,BID,OTH
    1  ,1    ,0  ,1  , asd
    2  ,1    ,1  ,1  , asd1
    3  ,1    ,0  ,0  , asd2
    4  ,1    ,1  ,2  , asd323
    5  ,1    ,3  ,3  , asd3
    6  ,2    ,0  ,0  , asd4
    7  ,2    ,6  ,5  , asd32

    B表
    BID,EleID,OTH
    1  ,1    , 345czd
    2  ,1    , dfg
    3  , 1    , dfg
    4  , 1    , gfh
    5  , 2    , 234234ds
    6  , 2    , fggfd

    复制两张表的EleID为1的数据,并使复制的新数据的EleID=3,同时对应的OTH的值保留不变,并同时建立两表之间的新的数据关系

    操作完成后数据表的数据变为
    A表
    AID ,EleID,PAID,BID,OTH
    1  ,1    ,0  ,1  , asd
    2  ,1    ,1  ,1  , asd1
    3  ,1    ,0  ,0  , asd2
    4  ,1    ,1  ,2  , asd323
    5  ,1    ,3  ,3  , asd3
    6  ,2    ,0  ,0  , asd4
    7  ,2    ,6  ,5  , asd32
    8  ,3    ,0  ,7  , asd
    9  ,3    ,8  ,7  , asd1
    10  ,3    ,0  ,0  , asd2
    11  ,3    ,8  ,8  , asd323
    12  ,3    ,10  ,9  , asd3


    B表
    BID,EleID,OTH
    1  ,1    , 345czd
    2  ,1    , dfg
    3  , 1    , dfg
    4  , 1    , gfh
    5  , 2    , 234234ds
    6  , 2    , fggfd
    7  ,3    , 345czd
    8  ,3    , dfg
    9  , 3    , dfg
    10 , 3    , gfh

    如何实现数据复制?


    xx
    • 已移动 mldark 2010年2月28日 15:52 (发件人:Visual C#)
    2010年2月27日 14:41

答案

  • --为了方便需要增加1个列
    alter table A 
    add OAID int
    
    alter table B 
    add OBID int
    --同步数据
    insert into A (EleID,PAID,BID,OTH,OAID)
    select 3,PAID,BID,OTH,AID from A where EleID=1
    
    insert into B(EleID,OTH,OBID)
    select 3,OTH,BID from B where EleID=1
    --更新
    UPDATE t1 set PAID=t2.AID
    from A t1,A t2
    where t1.PAID=t2.OAID AND NOT t1.OAID IS NULL
    
    UPDATE A SET BID=t2.BID
    from A t1,B t2
    where NOT t2.OBID IS NULL AND NOT t1.OAID IS NULL AND t2.OBID=t1.BID 
    --查看结果
    AID         EleID       PAID        BID         OTH                  OAID
    ----------- ----------- ----------- ----------- -------------------- -----------
    1           1           0           1           asd                  NULL
    2           1           1           1           asd1                 NULL
    3           1           0           0           asd2                 NULL
    4           1           1           2           asd323               NULL
    5           1           3           3           asd3                 NULL
    6           2           0           0           asd4                 NULL
    7           2           6           5           asd32                NULL
    8           3           0           7           asd                  1
    9           3           8           7           asd1                 2
    10          3           0           0           asd2                 3
    11          3           8           8           asd323               4
    12          3           10          9           asd3                 5
    
    (12 行受影响)
    
    BID         EleID       OTH                  OBID
    ----------- ----------- -------------------- -----------
    1           1           345czd               NULL
    2           1           dfg                  NULL
    3           1           dfg                  NULL
    4           1           gfh                  NULL
    5           2           234234ds             NULL
    6           2           fggfd                NULL
    7           3           345czd               1
    8           3           dfg                  2
    9           3           dfg                  3
    10          3           gfh                  4
    --删除辅助列(自己写吧)
    

    family as water
    2010年3月4日 9:48
  • 用SSIS可能会很方便
    咯咯
    2010年3月4日 10:00

全部回复

  • Are they in same db? You need real time data sync? Which version of sql server?
    2010年2月28日 15:56
  • 太复杂了,建议楼主写程序复制!

    2010年3月4日 9:19
    版主
  • --为了方便需要增加1个列
    alter table A 
    add OAID int
    
    alter table B 
    add OBID int
    --同步数据
    insert into A (EleID,PAID,BID,OTH,OAID)
    select 3,PAID,BID,OTH,AID from A where EleID=1
    
    insert into B(EleID,OTH,OBID)
    select 3,OTH,BID from B where EleID=1
    --更新
    UPDATE t1 set PAID=t2.AID
    from A t1,A t2
    where t1.PAID=t2.OAID AND NOT t1.OAID IS NULL
    
    UPDATE A SET BID=t2.BID
    from A t1,B t2
    where NOT t2.OBID IS NULL AND NOT t1.OAID IS NULL AND t2.OBID=t1.BID 
    --查看结果
    AID         EleID       PAID        BID         OTH                  OAID
    ----------- ----------- ----------- ----------- -------------------- -----------
    1           1           0           1           asd                  NULL
    2           1           1           1           asd1                 NULL
    3           1           0           0           asd2                 NULL
    4           1           1           2           asd323               NULL
    5           1           3           3           asd3                 NULL
    6           2           0           0           asd4                 NULL
    7           2           6           5           asd32                NULL
    8           3           0           7           asd                  1
    9           3           8           7           asd1                 2
    10          3           0           0           asd2                 3
    11          3           8           8           asd323               4
    12          3           10          9           asd3                 5
    
    (12 行受影响)
    
    BID         EleID       OTH                  OBID
    ----------- ----------- -------------------- -----------
    1           1           345czd               NULL
    2           1           dfg                  NULL
    3           1           dfg                  NULL
    4           1           gfh                  NULL
    5           2           234234ds             NULL
    6           2           fggfd                NULL
    7           3           345czd               1
    8           3           dfg                  2
    9           3           dfg                  3
    10          3           gfh                  4
    --删除辅助列(自己写吧)
    

    family as water
    2010年3月4日 9:48
  • 用SSIS可能会很方便
    咯咯
    2010年3月4日 10:00