0

我需要制作通用数据库。它应该看起来像下面的例子。

http://s11.postimage.org/4n6sigf37/Untitled_picture.png

我需要一些动态存储过程或查询。

这是一种存储在我的 sql 中的 wordpress 帖子。

我需要使用 SQL Server。

4

2 回答 2

2

基本上,您正在尝试在PIVOT其中获取列中的值key并将每个值转换为自己的列的数据。如果您知道要转换的值,则可以通过 static 对它们进行硬编码PIVOT,类似于:

select id, name, email, password, state, city
from 
(
  select u.id,
    u.name,
    u.email,
    u.password,
    m.[key],
    m.value
  from users u
  left join usermeta m
    on u.id = m.user_id
) x
pivot
(
  max(value)
  for [key] in ([State], [City])
) p;

请参阅带有演示的 SQL Fiddle

但是你说你有一个未知数量的列,所以你会想要使用一个动态的PIVOT

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

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

set @query = 'SELECT id, name, email, password, ' + @cols + ' from 
             (
                select u.id,
                  u.name,
                  u.email,
                  u.password,
                  m.[key],
                  m.value
                from users u
                left join usermeta m
                  on u.id = m.user_id
            ) x
            pivot 
            (
                max(value)
                for [key] in (' + @cols + ')
            ) p '

execute(@query)

请参阅带有演示的 SQL Fiddle

于 2012-10-04T01:31:29.543 回答
0

这应该有效:

SELECT a.ID, a.Name, a.Email, a.Password
    (SELECT Value FROM UserMeta WHERE Key = 'State' AND User_Id = a.ID) AS State,
    (SELECT Value FROM UserMeta WHERE Key = 'City' AND User_Id = a.ID) AS City
FROM User a
于 2012-10-04T00:11:28.923 回答