0

使用 SQL Server,有一个名称值对表。每一行基本上都是userid,contentid,sectionid,parameter,value。所以有我想在表格中显示的数据,例如用户信息。每一点信息都在它自己的行中,那么我如何将它放入 DataSet 以在中继器中使用?我可以以某种方式将行合并为一个吗?所以我可以在一行上获得多个参数/值对?

像……

用户 32 的两行:

(param / value)
fname / Bob
lname / Smith

显示在中继器的一行中,如下所示:

Bob Smith

有任何想法吗?哦,是的,它采用名称/值对格式的原因是为了遵守所需的标准。

4

4 回答 4

1

也许像...

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
于 2009-05-27T03:01:31.777 回答
0

糟糕的标准.... :)

无论如何,你最好的选择是用你的存储过程玩一些魔法(光标),并以你想要的格式从存储过程中返回数据。然后绑定到数据集或字符串列表是微不足道的。

于 2009-05-27T02:55:50.023 回答
0

另一种选择是PIVOT

像这样的东西(未经测试,因为我现在没有 SQL Server)

SELECT UserID, [fname] AS firstname, [lname] AS lastname
FROM 
(SELECT UserID, value, name from PairTable WHERE UserID=32 ) p
PIVOT
(
value
FOR name IN
( [fname], [lname] )
) AS pvt
于 2009-05-27T03:06:22.187 回答
0

那张桌子太糟糕了。没有冒犯的意思 ;-)

关系数据库只是不能很好地处理 EAV 表。

您还可以分组并执行条件 CASE 语句 - 如下所示:

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 一起使用。

于 2009-05-27T03:24:47.563 回答