2010-10-10 7 views
0

j'ai trois tablesencore une autre question tsql

documents 
attributes 
attributevalues 

documents peuvent avoir de nombreux attributs et ces atributs ont une valeur dans AttributeValue tableau

ce que je veux dans la requête unique obtenir tous les documents et atributs assignés des pertinents documents dans la rangée chaque rangée (je suppose que tous les documents ont les mêmes attributs assignés ne nécessitent pas la complexité de différents attribue maintenant)

par exemple

docid attvalue1 attvalue2 

1   2   2 

2   2   2 

3   1   1 

Comment puis-je faire dans seule requête

+3

Sans la structure de la table est difficile de répondre à cette question. Veuillez écrire dans la colonne du tableau des données stockées dans trois sorties plus complexes. –

+0

Attendez, cela n'a aucun sens. Les ID de document 1 et 2 ont deux fois la valeur d'attribut 2? L'ID de document 3 a deux fois la valeur d'attribut 1? Pourquoi ces documents ont-ils des attributs en double? – LittleBobbyTables

Répondre

0

Si vous connaissez tous les attributs (et leurs papiers d'identité) au moment de la conception:

SELECT d.docid, 
     a1.attvalue AS attvalue1 
     a2.attvalue AS attvalue2 
    FROM documents d 
    JOIN attributevalues a1 ON d.docid = a1.docid 
    JOIN attributevalues a2 ON d.docid = a2.docid 
WHERE a1.attrid = 1 
    AND a2.attrid = 2 

Si vous ne faites pas, les choses deviennent tout à fait un peu plus compliqué et difficile à répondre sans connaître votre schéma.

+0

non je ne sais pas atts – aeon

2

En haut si ma tête, je ne pense pas que vous pouvez le faire sans SQL dynamique. Le point crucial de la technique Entity-Attribute-Value (EAV) (que vous utilisez) est de stocker des colonnes en tant que lignes. Ce que vous voulez faire est de convertir ces lignes en colonnes dans le but de cette requête. Utiliser PIVOT rend cela possible. Cependant, PIVOT nécessite de connaître le nombre de lignes devant être converties en colonnes au moment de l'écriture de la requête. Donc, en supposant que vous utilisez EAV parce que vous avez besoin d'attributs/valeurs flexibles, vous ne connaîtrez pas cette information lorsque vous écrivez la requête. La solution consisterait donc à utiliser le SQL dynamique en conjonction avec PIVOT. Est-ce une recherche rapide et cela semble prometteur (n'a pas vraiment lu la chose):

http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx

Pour mémoire, je ne suis pas fan de SQL dynamique et recommande de trouver une autre approche du problème plus (par exemple pivotant dans le code de l'application).

+0

merci phil pivot est la réponse – aeon

-1

permet de faire par exemple

colonnes de table documents

docid,docname,createddate,createduser 

et les valeurs

1 account.doc 10.10.2010 aeon 
2 hr.doc 10.11.2010 aeon 

atributs colonnes

de la table
attid,name,type 

et les valeurs

1 subject string 
2 recursive int 

AttributeValues ​​colonnes de la table

attvalueid,docid,attid,attvalue(sql_variant) 

et valeurs

1 1 1 "accounting doc" 
1 1 2 0 
1 2 1 "humen r doc" 
1 2 2 1 

et je veux résultat de la requête

docid,name,atribvalue1,atribvalue1,atribvalueN 
1 account.doc "accounting doc" 0 
2 hr.doc "humen r doc" 1 
+1

(1) Vous devriez vraiment modifier le contenu de votre message original avec ceci au lieu de répondre à votre propre question. (2) Vous devez vraiment utiliser les balises 'Code' autour de votre code (c'est le bouton avec le petit 101 010). – LittleBobbyTables

+0

désolé je vais le faire – aeon