表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可以有值,也可以为null
现在我必须将id-1
,i d-2
,id-3
移至Table2
行,如下所示:
由于Sam有2个id:id-1
& id-3
对于相同的数字145 Sam有2行
由于David在Table 1
中有3个ID,因此Table 2
为David提供了3行相同的数量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
答案 0 :(得分:1)
由于您使用的是SQL Server 2008,因此可以使用CROSS APPLY
和VALUES
取消数据。此过程将获取列值并将其转换为行:
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;
答案 1 :(得分: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