En fait non, il n'y a pas de façon plus intelligente d'écrire ceci (sans visiter Y deux fois) étant donné que le X auquel myTable.X et myTable.YY correspondent peut ne pas provenir de la même ligne.
Comme alternative, la forme EXISTS de la requête est
select *
from myTable A
where exists (select * from Y where A.X = Y.X)
and exists (select * from Y where A.XX = Y.X)
Si Y contient X valeurs de 1,2,3,4,5
, et x.x = 2
et x.xx = 4
, ils existent tous les deux (sur des enregistrements différents dans Y) et l'enregistrement de myTable doit être affiché dans la sortie.
EDIT :cette réponse précédemment a déclaré que You could rewrite this using _EXISTS_ clauses which will work faster than _IN_
. Comme Martin l'a souligné, ce n'est pas vrai (certainement pas pour SQL Server 2005 et supérieur). Voir les liens
- http://explainextended.com/2009 /06/16/in-vs-join-vs-exists/
- http://sqlinthewild.co .za/index.php/2009/08/17/exists-vs-in/