2012-10-09 63 views
2

我有一個表,鏈接到另一個表,指定鍵值對的值。 Value表然後鏈接到一個包含名稱(鍵)的表。這些表被定義爲(足夠接近)如下:SQL存儲動態數據

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

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

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

每個實體可以有多個值,每個值都有一個密鑰。每個實體可能不具有相同數量的值。基本上,這個結構允許我動態地添加表格行,而無需修改實體表格。

我想要做一個選擇*對實體表,使用Key.Name字段作爲列標題,並顯示相應的Value.Values

是否有一個動態的結構,SQL,我可以做可用插入到實體中的每一行,然後返回一個選擇?

我希望這是有道理的!

+0

這種類型的動態操作是非常系統相關的。你使用什麼樣的數據庫?此外,您是否僅限於在SQL中執行此操作,或者您是否可以使用調用SQL的外部語言?後者會使這更容易。 – dan1111

+0

SQL Server 2008 R2。 – Jay

+0

理論上看起來不錯 - 在實踐中並不好。 – Randy

回答

5

根據您的描述,這聽起來像是你想要的PIVOT的數據。有兩種方法可以使用PIVOT來做到這一點,無論是對要轉換的列進行編碼的Static Pivot,還是確定執行時的列的Dynamic Pivot。

靜態支點:

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

動態樞軸確定在運行時的列:

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

這兩個可以放置在存儲過程中。如果您爲每個表格發佈了一些示例數據,然後發佈了期望的結果,那麼確定正確的查詢會更容易。

+0

我設法修改您的示例並使其與我的數據庫一起工作。非常感謝您的幫助! – Jay

+0

@Jay很高興你能工作。 – Taryn