MSSQL Select avec "vertical" -where

Je ne sais pas vraiment comment expliquer sauf avec "vertical où".

Imaginez le tableau suivant:

TAGID|PRODUCTID|SHOP_ID 59 |3418-7 |38 61 |3418-7 |38 60 |4227-4 |38 61 |4227-4 |38 

Maintenant, je veux returnner tous les ID de produits, qui ont un rapport avec les ID de balise: 59,61. En d'autres termes, les valeurs de l'ID de produit où des lignes existent pour les deux ID de tag.

Donc, je veux revenir 3418-7, mais pas 4227-4

Comment écrire ceci aussi simple que possible dans une instruction SQL?

C'est la déclaration de travail que j'ai jusqu'à présent, mais je pense que cela pourrait être fait d'une manière beaucoup plus intelligente:

 SELECT productid FROM shop_tag_relations WHERE productid IN (select productid from shop_tag_relations WHERE tagid=59) AND productid IN (select productid from shop_tag_relations WHERE tagid=61) GROUP BY productid,shop_id 

 SELECT PRODUCTID FROM T WHERE TAGID IN (59,61) GROUP BY PRODUCTID HAVING COUNT(DISTINCT TAGID) = 2 

Ou

 SELECT PRODUCTID FROM T WHERE TAGID = 59 INTERSECT SELECT PRODUCTID FROM T WHERE TAGID = 61 
 SELECT DISTINCT a.PRODUCTID FROM mytable AS a INNER JOIN mytable AS b ON a.PRODUCTID=b.PRODUCTID WHERE a.TAGID=59 AND b.TAGID=61 ; 
 SELECT ProductId FROM shop_tag_relations WHERE TAGID IN (59,61) GROUP BY ProductId HAVING COUNT(DISTINCT TagId) = 2