6

次の形式のテーブルがあります。

ID,Value1,Value2,Value3
1,2,3,4

これをに変換する必要があります。

ID,Name,Value
1,'Value1',2
1,'Value2',3
1,'Value3',4

これを 1 つの SELECT ステートメントで (つまり、UNION なしで) 行う賢い方法はありますか? 列名 Value1、Value2、および Value3 は固定され、一定です。

データベースはオラクル9iです。

4

9 に答える 9

9

試してみてくださいunion

select ID, 'Value1' as Name, Value1 as Value from table_name union all
select ID, 'Value2', Value2 as Value from table_name union all
select ID, 'Value3', Value3 as Value from table_name

order by ID, Name

usingunion allは、サーバーが a を実行しないことを意味しますdistinct(これはunion操作で暗黙的です)。データに違いはありませんが (ID が異なることが望ましいため)、少し高速化される可能性があります。

于 2009-05-20T13:27:27.583 に答える
4

これは Oracle 10g で動作します。

select id, 'Value' || n as name,
       case n when 1 then value1 when 2 then value2 when 3 then value3 end as value
from (select rownum n
      from (select 1 from dual connect by level <= 3)) ofs, t

Oracle 9i には再帰クエリがあったと思いますか? とにかく、CASE サポートがあると確信しているので、再帰クエリがなくても、代わりに "(デュアル ユニオンから 1 を選択 すべて デュアル ユニオンから 2 を選択 すべて デュアルから 3 を選択) ofs" を実行できます。再帰クエリの悪用は、Oracle ではもう少し一般的です。(ただし、ユニオンを使用して行を生成すると、他の DB に移植できます)

于 2009-05-20T14:03:16.607 に答える
2

次のようにできますが、きれいではありません。

SELECT id,'Value 1' AS name,value1 AS value FROM mytable
UNION
SELECT id,'Value 2' AS name,value2 AS value FROM mytable
UNION
SELECT id,'Value 3' AS name,value3 AS value FROM mytable
于 2009-05-20T13:27:42.357 に答える
2

3 つの select ステートメントを結合すると、うまくいくはずです。

SELECT ID, 'Value1', Value1 AS Value
FROM TABLE
UNION
SELECT ID, 'Value2', Value2 AS Value
FROM TABLE
UNION
SELECT ID, 'Value3', Value3 AS Value
FROM TABLE
于 2009-05-20T13:28:18.893 に答える
0

SQL Server 2005 以降を使用している場合は、UNPIVOT を使用できます

CREATE TABLE #tmp ( ID int, Value1 int, Value2 int, Value3 int)

INSERT INTO #tmp (ID, Value1, Value2, Value3) VALUES (1, 2, 3, 4)

SELECT
    *
FROM
    #tmp

SELECT
    *
FROM
    #tmp
UNPIVOT
(
    [Value] FOR [Name] IN (Value1, Value2, Value3)
) uPIVOT

DROP TABLE #tmp
于 2009-05-20T13:29:56.050 に答える
0

他の人が示唆しているように、UNION ALLはおそらくSQLでの最善の策です。特定の要件に応じて、フロントエンドでこれを処理することを検討することもできます。

于 2009-05-20T14:14:20.890 に答える
-1

SQL Serverの場合、UNIONの代わりにUNPIVOTを検討してください。

SELECT id, value, colname
FROM #temp t
UNPIVOT (Value FOR ColName IN (value1,value2,value3)) as X

これにより、列名も返されます。Xが何に使用されているかはわかりませんが、除外することはできません。

于 2009-05-20T13:36:06.910 に答える