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はここでは機能しないようです。

カーソルを使用して各行を移動したり、2行に選択したり、一時テーブルに挿入したりすることは避けようとしています。このアプローチは確かに機能しますが、より良いセットベースのアプローチはありますか?

4

3 に答える 3

3

UNIONこれには、入力データのスキャンを 1 回だけ行うという利点があります。

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

または、VALUES構文が2008年以降であるため@MartinSmithが推奨するように(まだ単一のスキャン)

--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

2 つの一時テーブルを作成するか、選択 --- 1 つは RowID、String1、および Int1 を選択し、もう 1 つは RowID、String2、および Int2 を選択します。次に、String 列を単なる String にエイリアスまたはラベル付けし、Int 列を単なる Int にエイリアスまたはラベル付けします。次に、それらの 2 つをすべて UNION して結果を取得します。

しかし、私は T-SQL に精通していません。これは、一般的な SQL の領域からの単なる答えです。

一時テーブルを使用したくないことに気付きましたが、2 つの選択を一緒に UNION した場合、データベースは、実際にはローバイを必要としないジョブを完了するためのはるかに高速な方法を実現しませんか? -行カーソル?

于 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 に答える