根据您的描述,听起来您想要PIVOT
数据。使用 PIVOT 有两种方法可以做到这一点,一种是您对要转换的列进行编码的静态 Pivot,另一种是在执行时确定列的动态 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
Dynamic Pivot 在运行时确定列:
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
这两个都可以放在存储过程中。如果您为每个表发布一些示例数据,然后发布所需的结果,则更容易确定正确的查询。