2

キーと値のペアの値を指定する別のテーブルにリンクするテーブルがあります。値テーブルは、名前 (キー) を保持するテーブルにリンクします。テーブルは次のように (ほぼ) 定義されています。

---------------
Entity
---------------
EntityID
Name
Some other data

---------------
Value
----------------
ValueID
EntityID
Value

---------------
Key
---------------
KeyID
ValueID
Name

各エンティティは多くの値を持つことができ、各値は 1 つのキーを持ちます。各エンティティは、同じ数の値を持つとは限りません。基本的に、この構造により、Entity テーブルを変更せずにテーブル行を動的に追加できます。

Key.Name フィールドを列ヘッダーとして使用し、適切な Value.Values を表示して、Entity テーブルで select * を実行したい

エンティティの各行に挿入して選択を返すことができる SQL で利用可能な動的構造はありますか?

これが理にかなっていることを願っています!

4

1 に答える 1

5

あなたの説明に基づいて、それはあなたがデータにしたいように聞こえPIVOTます。PIVOT でこれを行うには 2 つの方法があります。変換する列をコーディングする静的ピボットと、実行時に列を決定する動的ピボットのいずれかです。

静的ピボット:

select *
from
(
  select e.entityid, v.value,
    e.name EntityName, k.name KeyName
  from value v
  left join entity e
    on v.entityid = e.entityid
  left join [key] k
    on v.valueid = k.valueid
) x
pivot
(
  max(value)
  for KeyName in ([name 1], [name 2], [name 3], [name 4], [name 5])
) p;

デモで SQL Fiddleを参照してください

動的ピボットは、実行時に列を決定しました。

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name) 
                    from [key]
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT entityid, EntityName, ' + @cols + ' from 
             (
                select e.entityid, v.value,
                  e.name EntityName, k.name KeyName
                from value v
                left join entity e
                  on v.entityid = e.entityid
                left join [key] k
                  on v.valueid = k.valueid
            ) x
            pivot 
            (
                max(value)
                for KeyName in (' + @cols + ')
            ) p '

execute(@query)

デモで SQL Fiddleを参照してください

これらは両方とも、ストアド プロシージャに配置できます。各テーブルにいくつかのサンプル データを投稿してから、目的の結果を投稿すると、適切なクエリを簡単に判断できます。

于 2012-10-09T13:25:49.453 に答える