假设我有下表:
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 似乎不起作用。
我试图避免使用游标遍历每一行,将其选择为两行,将它们插入到临时表中,依此类推。这种方法肯定会奏效,但是有更好的,基于集合的方法吗?
答案 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