2

假设我有下表:

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似乎在这里不起作用。

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

4

3 回答 3

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]);
于 2012-06-06T23:47:42.233 回答
2

制作两个临时表或选择 --- 一个选择 RowID、String1 和 Int1,另一个选择 RowID、String2 和 Int2。然后将 String 列别名或标记为 String,将 Int 列别名为 Int。然后将这两者联合起来得到你的结果。

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

我确实注意到您不想使用临时表,但是如果您只是将两个选择 UNIONed 一起进行,那么您的数据库是否会找到一种更快的方法来完成实际上不涉及逐行的工作-行光标?

于 2012-06-06T23:44:30.097 回答
1

试试这个:

SELECT row_id, string1, int1 from myTable
UNION
SELECT row_id, string2, int2 from myTable
于 2012-06-06T23:49:29.823 回答