SQL:在同一个表中复制记录

时间:2011-12-06 00:51:28

标签: sql sql-server sql-server-2008

SQL Server 2008表:table1

ID  DESC     TYP   SUBSET  VAL1   VAL2   VAL3   VAL4  PReview   Country

 1   DESC1    1      1      1.0    1.1   1.2    1.2    0         1
 2   DESC1    1      1      2.0    1.1   1.2    1.2    0         1
 3   DESC1    1      1      1.0    1.1   1.2    1.2    0         1 
 4   DESC2    2      1      3.0    2.1   1.7    1.8    0         1
 5   DESC2    2      1      4.0    3.1   1.7    1.9    0         1
 6   DESC2    2      1      5.0    6.1   1.5    1.6    0         1 
13   DESC1    1      1      1.0    1.1   1.2    1.2    1         1
14   DESC1    1      1      2.0    1.1   1.2    1.2    1         1
15   DESC1    1      1      1.0    1.1   1.2    1.2    1         1 

16   DESC2    2      1      1.0    6.1   1.7    1.2    1         1
17   DESC2    2      1      2.0    4.1   6.2    8.2    1         1
18   DESC2    2      1      1.0    8.1   7.2    1.9    1         1 

我需要将具有preview = 1的记录复制到具有预览0的记录中。没有办法唯一地定义每条记录。只有它们才能以有序的方式复制。 记录13应复制到记录1 记录14应复制到记录2 记录15应复制到记录3

感谢。

2 个答案:

答案 0 :(得分:1)

如果你需要记录“复制”预览= 0记录,你不能只是:

  • 删除preview = 0记录
  • 复制每个preview = 1记录,以便每份都有两份副本。

这听起来就像你要求的那样。

答案 1 :(得分:1)

基本思想是“枚举”(即附加索引)源和目标行,然后将索引为1的源行分配给索引为1的目标行,索引为2的源行到索引的目标行2等:

UPDATE TABLE1
SET
    [DESC] = SOURCE.[DESC],
    TYP = SOURCE.TYP,
    SUBSET = SOURCE.SUBSET,
    VAL1 = SOURCE.VAL1,
    VAL2 = SOURCE.VAL2,
    VAL3 = SOURCE.VAL3,
    VAL4 = SOURCE.VAL4,
    PREVIEW = SOURCE.PREVIEW,
    COUNTRY = SOURCE.COUNTRY
FROM (
    SELECT DEST_ID, SRC.*
    FROM
        (SELECT ID DEST_ID, RANK() OVER (ORDER BY ID) R FROM TABLE1 WHERE PREVIEW = 0) DEST
        JOIN (SELECT *, RANK() OVER (ORDER BY ID) R FROM TABLE1 WHERE PREVIEW = 1) SRC
            ON SRC.R = DEST.R
) SOURCE
WHERE TABLE1.ID = SOURCE.DEST_ID

用简单的英语:

  • 按照ID(RANK() OVER (ORDER BY ID))的顺序将索引附加到PREVIEW = 0的行。
  • 在PREVIEW = 1的地方做同样的事。
  • 将源与目标索引匹配(JOIN ... ON SRC.R = DEST.R)。
  • 根据匹配更新表格。

当目标行数小于源行数时请小心 - 初始查询执行不会更新所有目标行,第二次执行可能会导致相同的源行复制到不同目标行。

实际上,您要将同一源行复制到多个目标行。