根據您的描述,這聽起來像是你想要的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
這兩個可以放置在存儲過程中。如果您爲每個表格發佈了一些示例數據,然後發佈了期望的結果,那麼確定正確的查詢會更容易。
這種類型的動態操作是非常系統相關的。你使用什麼樣的數據庫?此外,您是否僅限於在SQL中執行此操作,或者您是否可以使用調用SQL的外部語言?後者會使這更容易。 – dan1111
SQL Server 2008 R2。 – Jay
理論上看起來不錯 - 在實踐中並不好。 – Randy