次の形式のテーブルがあります。
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です。
試してみてください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 が異なることが望ましいため)、少し高速化される可能性があります。
これは 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 に移植できます)
次のようにできますが、きれいではありません。
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
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
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
他の人が示唆しているように、UNION ALLはおそらくSQLでの最善の策です。特定の要件に応じて、フロントエンドでこれを処理することを検討することもできます。
SQL Serverの場合、UNIONの代わりにUNPIVOTを検討してください。
SELECT id, value, colname
FROM #temp t
UNPIVOT (Value FOR ColName IN (value1,value2,value3)) as X
これにより、列名も返されます。Xが何に使用されているかはわかりませんが、除外することはできません。