Asp.net 将数据从名称-值对表中获取到数据集的高效SQL过程?
使用SQL Server,创建一个名称-值对表。每一行基本上都是userid、contentid、sectionid、parameter和value。所以我想在一个表中显示一些数据,比如用户信息。每一位信息都在它自己的行中,所以如何将其放入数据集中以供中继器使用?我能把这些行合并成一行吗?所以我可以在一行上获得多个参数/值对 就像 用户32有两行:Asp.net 将数据从名称-值对表中获取到数据集的高效SQL过程?,asp.net,sql-server,entity-attribute-value,Asp.net,Sql Server,Entity Attribute Value,使用SQL Server,创建一个名称-值对表。每一行基本上都是userid、contentid、sectionid、parameter和value。所以我想在一个表中显示一些数据,比如用户信息。每一位信息都在它自己的行中,所以如何将其放入数据集中以供中继器使用?我能把这些行合并成一行吗?所以我可以在一行上获得多个参数/值对 就像 用户32有两行: (param / value) fname / Bob lname / Smith 显示在中继器的一行上,如下所示: Bob Smith SEL
(param / value)
fname / Bob
lname / Smith
显示在中继器的一行上,如下所示:
Bob Smith
SELECT UserID,
MAX(CASE WHEN param = 'fname' THEN value ELSE '' END) AS fname,
MAX(CASE WHEN param = 'lname' THEN value ELSE '' END) AS lname
FROM MyEAVTable
GROUP BY UserID
有什么想法吗?哦,是的,它采用名称/值对格式的原因是为了遵守所需的标准。糟糕的标准……)
无论如何,最好的办法是对存储过程使用一些魔法(光标),并以所需的格式从存储过程返回数据。那么绑定到数据集或字符串列表就很简单了。可能类似于
SELECT fff.firstname, lll.lastname
FROM (
SELECT ff.value AS firstname
FROM PairTable AS ff
WHERE ff.param = 'fname'
AND ff.userId = 32
) fff, (
SELECT ll.value AS lastname
FROM PairTable AS ll
WHERE ll.param = 'lname'
AND ll.userId = 32
) lll
另一种选择是
类似这样的内容(未经测试,因为我现在没有SQL Server)
那张桌子糟透了。无意冒犯;-) 关系数据库不能很好地处理EAV表 您还可以分组并执行条件CASE语句,如下所示:
Bob Smith
SELECT UserID,
MAX(CASE WHEN param = 'fname' THEN value ELSE '' END) AS fname,
MAX(CASE WHEN param = 'lname' THEN value ELSE '' END) AS lname
FROM MyEAVTable
GROUP BY UserID
PIVOT语法很棒-此解决方案的唯一好处是它也可以与SQL 2000一起使用。这比PIVOT更简单,+1此设计更常见的名称是实体属性值,或EAV。