2

このクエリを書くためのより良い(より効率的な)方法はありますか?たった1つで書く方法があるはずのようUNIONです。

クエリ:

SELECT 'Value1' as PropertyKey, PropertyValue=(SELECT Value1 FROM MyTable WITH (NOLOCK))
UNION
SELECT 'Value2' as PropertyKey, PropertyValue=(SELECT Value2 FROM MyTable WITH (NOLOCK))
UNION
SELECT 'Value3' as PropertyKey, PropertyValue=(SELECT Value3 FROM MyTable WITH (NOLOCK))
UNION
...
SELECT 'Value100' as PropertyKey, PropertyValue=(SELECT Value100 FROM MyTable WITH (NOLOCK))

最終的に、結果セットに2つの列(、、PropertyKeyおよびPropertyValue)を含める必要があります。列の値PropertyKeyは私のテーブルの列の名前になり、列の値PropertyValueは対応する値になります。

UNIONいつも同じテーブルから選択している場合、これを1つだけで書くことは可能ですか?

4

1 に答える 1

3

関数にアクセスUNPIVOTできる場合は、次の方法で使用できます。

select PropertyKey, PropertyValue
from yourtable
unpivot
(
  PropertyValue
  for PropertyKey in (Value1, Value2, Value3) -- list other columns here
) unpiv

覚えておくべき重要な部分UNPIVOTは、データ型が同じでなければならないため、データ型を変換する必要がある場合があります。

select PropertyKey, PropertyValue
from
(
    select CAST(value1 as varchar(10)), 
         CAST(value1 as varchar(10)), ...
    from yourtable
) src
unpivot
(
  PropertyValue
  for PropertyKey in (Value1, Value2, Value3) -- list other columns here
) unpiv

これを動的に実行することもできます。これにより、実行時に変換する列のリストが取得されます。

DECLARE @colsUnpivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)    

select @colsUnpivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('yourtable')
         for xml path('')), 1, 1, '')

set @query 
  = 'select PropertyKey, PropertyValue
     from yourtable
     unpivot
     (
        PropertyValue
        for PropertyKey in ('+ @colsunpivot +')
     ) u'

exec(@query)

行き詰まっている場合は、現在のバージョンを使用して、少し変更し、 :のUNION ALL代わりに使用します。UNION

SELECT 'Value1' as PropertyKey, Value1 PropertyValue
FROM MyTable
UNION ALL
SELECT 'Value2' as PropertyKey, Value2 PropertyValue
FROM MyTable
于 2012-12-17T20:22:47.387 に答える