2010-05-20 12 views
2

J'ai des tables avec des données comme celui-cirequête sql server/question sous-requête

Id BookId TagId 
34 113421 9 
35 113421 10 
36 113421 11 
37 113421 1 
38 113422 9 
39 113422 1 
40 113422 12 

Je dois écrire une requête (SQL Server) qui me donne des données selon les balises dire si je veux bookIds où tagid = 9 il devrait retourner bookid 113421 et 113422 tel qu'il existe dans les deux livres, mais si je demande des données pour les étiquettes 9 et 10, il devrait renvoyer seulement le livre 113421 car c'est le seul livre où les deux étiquettes sont présentes.

Merci

Parminder

Répondre

2

Ce qui suit devrait fonctionner:

SELECT 
    BookId 
FROM 
    BookTags 
WHERE 
    TagId IN (9,10) 
GROUP BY BookId HAVING COUNT(*) = 2 

Vous devez définir le bit tel HAVING COUNT(*) = x que x est égal au nombre de tags que vous cherchez (donc dans ce cas, c'est 2. Si vous voulez 9, 10 & 11, vous devez mettre la 3, etc.)

(Note: Ceci est en supposant que vous n'avez pas des livres avec des valeurs en double TagId double)

+0

merci codeka. cela a fonctionné. – Parminder

0

SELECT * FROM OÙ Livres TagId IN (9,10)

+0

qui wont Aidez-moi. ça va me donner des rangées du deuxième set aussi. – Parminder

+0

Cela ne fait pas ce qu'il veut. Si vous passez dans 9 et 10, il ne veut que des livres avec un TagId de 9 * et * 10. Votre code retournerait tous les livres avec un TagId de 9 * ou * 10. –

0
Select distinct BookId From Books Where TagId = 9 

intersect 

Select distinct BookId From Books Where TagId = 10 

Hope this helps