2009-05-27 8 views
0

À l'aide de SQL Server, disposez d'une table de paires de valeurs de nom. Chaque ligne est essentiellement userid, contentid, sectionid, parameter, value. Il y a donc des données que je veux afficher dans une table, comme des informations sur l'utilisateur. Chaque bit d'information est dans sa propre rangée, sow comment l'obtenir dans un DataSet pour une utilisation dans un répéteur? Puis-je fusionner les lignes en une seule façon? Donc, je peux obtenir plusieurs paires de paramètres/valeurs sur une ligne?Une procédure SQL efficace pour obtenir des données de la table de paires de valeurs de nom dans DataSet?

donc comme ...

deux lignes pour l'utilisateur 32:

(param/value) 
fname/Bob 
lname/Smith 

affiché sur une ligne dans un répéteur comme celui-ci:

Bob Smith 

Toutes les idées? Oh oui, et la raison pour laquelle il est dans le format de paire nom/valeur est d'adhérer à une norme requise.

+0

Le nom le plus commun de ce design est Entity-Attribute-Value, ou EAV. –

Répondre

1

Peut-être quelque chose comme ...

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

C'est plus simple que PIVOT, +1 –

0

norme Sucky .... :)

Quoi qu'il en soit, votre meilleur pari est de jouer un peu de magie (curseur) avec votre proc stocké et renvoyer les données de la procédure stockée dans le format que vous voulez. Puis, la liaison à un DataSet ou à une liste de chaînes est triviale.

0

Une autre alternative est PIVOT.

Quelque chose comme ça (non testé parce que je n'ai pas SQL Server autour de maintenant)

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

Ce tableau est terrible. Aucune infraction ;-)

Les bases de données relationnelles ne font tout simplement pas très bien les tableaux EAV.

Vous pouvez également grouper et faire des déclarations CASE conditionnelles - comme ceci:

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 

La syntaxe PIVOT est grande - le seul avantage de cette solution est que cela va fonctionner avec SQL 2000 ainsi.

Questions connexes