-1

表格1

column_pk  num  name   id -1   id-2     id-3
1          145  sam    12345   null     34527
2          187  tom    null    76544    null
3          567  david  78965   43215    89765
4          675  john   null    null     null

如上表所示,对于给定的 column_pk id-1、id-2、id-3 可以有值,也可以为空

现在我必须将id-1id-2移动id-3Table2如下行中:

  • 由于 Sam 有 2 个 id:id-1&id-3对于相同的 num 145 Sam 有 2 行

  • 由于 David 有 3 个 id Table 1,所以 DavidTable 2有 3 行相同的 num 567

表 2

Column_pk  num    name     id
1          145    sam      12345
2          145    sam      34527
3          187    tom      76544
4          567    david    78965
5          567    david    43215          
6          567    david    89765
  • 我尝试使用一些更新语句,但这些语句仅对有限的数据有用。当有大量数据传输时,你能帮我解决这个问题吗?
4

2 回答 2

1

由于您使用的是 SQL Server 2008,因此您可以使用和取消透视数据。此过程获取您的列值并将它们转换为行:CROSS APPLYVALUES

select row_number() over(order by t1.column_pk) column_pk,
  t1.num, 
  t1.name, 
  c.value
from table1 t1
cross apply
(
  values 
    ('id1', id1),
    ('id2', id2),
    ('id3', id3)
) c (col, value)
where c.value is not null;

请参阅带有演示的 SQL Fiddle

于 2013-04-09T02:34:13.670 回答
0

您可以使用UNION来组合结果。然后用于ROW_NUMBER()获取新的 pk 列:

select Row_Number() OVER (ORDER BY column_pk,sortorder) Column_pk, 
  num, name, id
from
  (
    select column_pk, num, name, id1 id, 1 sortorder
    from yourtable
    union 
    select column_pk, num, name, id2, 2 sortorder
    from yourtable
    union 
    select column_pk, num, name, id3, 3 sortorder
    from yourtable
    ) t
where id is not null

SQL 小提琴演示

于 2013-04-09T02:28:03.070 回答