2009-05-27 3 views
0

SQL Serverを使用する場合は、名前の値のペアテーブルが必要です。各行は、基本的にuserid、contentid、sectionid、parameter、valueです。したがって、ユーザー情報などの表に表示するデータがあります。情報の各ビットはそれ自身の行にあり、どのようにしてRepeaterで使用するためにDataSetに入れるのですか?何とか行を1つにマージできますか?だから私は1つの行に複数のパラメータ/値のペアを得ることができますか?名前値ペアテーブルからDataSetにデータを取得するための効率的なSQLプロシージャ?

はそうのような...ユーザー32のための

二列:

(param/value) 
fname/Bob 
lname/Smith 

は、このようなリピーターで1行に表示:

Bob Smith 

任意のアイデア?名前/値のペア形式の理由は、必要な標準に準拠することです。

+0

このデザインのより一般的な名前は、Entity-Attribute-ValueまたはEAVです。 –

答えて

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 
+0

これはPIVOTより簡単ですが、+1 –

0

嫌標準.... :)とにかく

、あなたの最善の策は、あなたのストアドプロシージャにいくつかの魔法(カーソル)を再生し、必要な形式でストアドプロシージャからデータを返すことです。その後、DataSetまたは文字列リストへのバインドは簡単です。

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 
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で動作することです。

関連する問題