2009-11-07 5 views
0

J'ai les données suivantes dans ma table.Récupérer les données de la table, Utiliser les lignes comme colonnes

alt text http://img26.imageshack.us/img26/3746/productfield.png

Je veux extraire ProductId qui a ce critère,

FieldValue = 1.0 and FieldValue = 'Y' and FieldValue = 'N' 

Ceci est impossible en utilisant la requête suivante

select * from MyTable 
WHERE (FieldId = 50 AND (FieldValue BETWEEN '1.0' AND '1.0')) 
AND (FieldId = 55 AND FieldValue = 'Y') 
AND (FieldId = 60 AND FieldValue = 'N') 

et je ne peux pas utiliser la requête comme celui-ci. Cette récupèreront également ProductId 103 et 104.

select * from MyTable 
WHERE (FieldId = 50 AND (FieldValue BETWEEN '1.0' AND '1.0')) 
OR (FieldId = 55 AND FieldValue = 'Y') 
OR (FieldId = 60 AND FieldValue = 'N') 

alt text http://img690.imageshack.us/img690/16/productfieldresult.png

Je ne sais pas ProductId à l'avance. En fait, je veux extraire ProductId en utilisant les critères FieldValue. Je ne peux pas utiliser ProductId dans ma clause where parce que je ne sais pas. Je connais seulement la valeur fieldValue et FieldId.

Merci pour votre aide!

+0

Je ne ai besoin ProductID critères correspondants je l'ai mentionné. Il n'est pas nécessaire de réorganiser les colonnes d'affilée. – Kashif

+0

Je pense que la solution de dotjoe est beaucoup plus pertinente parce que vous voulez effectuer la recherche basée sur les critères fieldvalue et pas sur fieldvalue et fieldid. (: –

+0

En effet, c'est une bonne question: Voulez-vous filtrer uniquement sur FieldValue ou sur (FieldId, FieldValue) -combinaisons? Votre question ressemble plus à la première, mais vos exemples SQL et "bon sens" mènent vers la seconde. .. – Heinzi

Répondre

0

Je suppose que vous voulez les éléments suivants:

SELECT ProductId from myTable 
WHERE ProductId IN (SELECT ProductId FROM myTable WHERE FieldId = 50 AND FieldValue = '1.0') 
    AND ProductId IN (SELECT ProductId FROM myTable WHERE FieldId = 55 AND FieldValue = 'Y') 
    AND ProductId IN (SELECT ProductId FROM myTable WHERE FieldId = 60 AND FieldValue = 'N') 

(Vous pouvez mettre l'un des critères dans le SELECT externe, mais je suppose qu'il est plus facile de lire cette façon.)

+0

A travaillé! Merci pour ton aide. – Kashif

0

Que pensez-vous de cela?

ProductId = 101 et FieldValue IN ('1.0', 'Y', 'N')

[Modifier]

Peut-être que vous pouvez utiliser une sous-requête comme ça?

SELECT * 
FROM MyTable 
WHERE ProductId = 
-- SubQuery for searching ProductId based on FieldId and FieldValue 
(SELECT TOP 1 ProductId 
FROM MyTable 
WHERE (FieldId = 50 AND (FieldValue BETWEEN '1.0' AND '1.0')) 
+0

ProductId est la valeur que je souhaite obtenir en utilisant les critères FieldValue. Donc, je ne peux pas utiliser PrdouctId = 101 – Kashif

+0

Pas si évidemment. Votre question n'est pas si évidente, en effet. Un champ d'affilée n'aura jamais deux valeurs à la fois, comme l'a déclaré Guffa. Mon « IN » solution est équivalente à celle –

+0

l'@Muhammad vérifier à nouveau ... cette fois-ci à l'aide d'un sous-requête –

0

Le FieldValue pour un enregistrement ne peut jamais avoir deux valeurs à la fois, c'est pourquoi une condition comme x=1 and x=2 ne peut pas être vrai.

Vous voulez utiliser or entre les conditions:

ProductId = 101 and (FieldValue = '1.0' or FieldValue = 'Y' and FieldValue = 'N') 

Edit:
Si vous devez trouver un ProductId avec cette combinaison de valeurs FieldID et fieldValue, vous devez faire un peu de se joindre à:

select * from MyTable 
where ProductId = (
    select ProductId 
    from MyTable m 
    inner join MyTable m2 on m2.ProductId = m.ProductId and m2.FieldId = 55 and FieldValue = 'Y' 
    inner join MyTable m3 on m3.ProductId = m.ProductId and m3.FieldId = 60 and FieldValue = 'N' 
    where FieldId = 50 and FieldValue = '1.0' 
) 
+0

Merci, je ne sais pas ProductId à l'avance, donc je ne peux pas l'utiliser dans mon cas. Toute solution utilisant la table de temp etc. – Kashif

+0

Je vois. J'ai ajouté une solution ci-dessus. – Guffa

1
select distinct t1.productid 
from mytable t1 
inner join mytable t2 on t1.productid = t2.productid 
inner join mytable t3 on t2.productid = t3.productid 
where t1.fieldvalue = '1.0' and t1.fieldid = 50 
and t2.fieldvalue = 'Y' and t2.fieldid = 55 
and t3.fieldvalue = 'N' and t3.fieldid = 60 
+0

bonne réponse ... exactement ce que les critères de l'OP est ... uniquement sur fieldvalue et non sur FieldID .. –

+0

mais vous avez oublié d'ajouter matable dans la jointures. jointure interne mytable t2 sur t1.productid = t2.productid jointure interne mytablet t3 sur t2.productid = t3.productid –

+0

oups oublié mytable – dotjoe

Questions connexes