如何将行反转为两行?

时间:2012-06-06 23:27:28

标签: tsql sql-server-2005

假设我有下表:

Row_ID String1 String2    Int1 Int2
1      'James' 'Jiao'     1    2
2      'Jack'  'Ripper'   1    3

我希望它看起来像这样:

Row_ID String     Int
1      'James'    1
1      'Jiao'     2
2      'Jack'     1
2      'Ripper'   3

请注意,Int1 / Int2永远不会相同。它们彼此独特。

不确定如何解决这个问题。准备好了其他一切,但却陷入了困境。我怀疑某种反向旋转会起作用吗? String列不是有限集,也不是Int列,因此 unpivot 似乎不起作用。

我试图避免使用游标遍历每一行,将其选择为两行,将它们插入到临时表中,依此类推。这种方法肯定会奏效,但是有更好的,基于集合的方法吗?

3 个答案:

答案 0 :(得分:3)

这比UNION仅对输入数据进行一次扫描有优势。

--2008+
SELECT ROW_ID, String, [Int]
FROM YourTable
    CROSS APPLY(VALUES (String1, Int1), (String2, Int2)) AS A (String, [Int]);

或者@MartinSmith建议,因为VALUES语法是2008+(仍然是单次扫描)

--2005+ compatible
SELECT ROW_ID, String, [Int]
FROM YourTable
    CROSS APPLY(SELECT String1, Int1 
                UNION ALL 
                SELECT String2, Int2) AS A (String, [Int]);

答案 1 :(得分:2)

创建两个临时表或选择---一个选择RowID,String1和Int1,另一个选择RowID,String2和Int2。然后别名或将String列标记为String,将Int列标记为Int。然后联合所有这两个人来获得你的结果。

但是我不熟悉T-SQL,这只是SQL的一般答案。

我确实注意到你不想使用临时表,但是如果你只选择两个UNIONed,那么你的数据库是否能够以更快的方式完成工作,而实际上并不涉及到逐行光标?

答案 2 :(得分:1)

试试这个:

SELECT row_id, string1, int1 from myTable
UNION
SELECT row_id, string2, int2 from myTable