2009-08-14 4 views
1

J'ai la requête suivante:IN Changement dans SQL à EXISTE

select A, 
     B 
    from table1 
where A in (select c 
       from table 2 
      ) 

Mais, maintenant, je dois changer cette requête et utiliser exists au lieu de in, et il devrait donner les mêmes résultats.

Mes tableaux ressemblent à ce qui suit:

table1   table2 
A B    c 
------    ----- 
1 x    1 
2 y    3 
3 z    4 
4 w    7 
5 a 
1 b 

Comment puis-je utiliser la fonction exists?

+1

cela ressemble à Oracle .. mais pleeeeeeease spécifier les SGBD que vous utilisez !! – guigui42

Répondre

10

Vous devez faire correspondre les deux colonnes qui seront utilisées dans le exists ensemble:

select 
    t1.a, t1.b 
from 
    table1 t1 
where 
    exists (select 1 from table2 t2 where t2.c = t1.a) 

La raison pour laquelle vous devez le faire, parce que exists effectue une semi-jointure sur la table, et par conséquent , doit avoir une condition de jointure.

4

Ceci le fera via une jointure interne directe.

select 
    t1.a, t1.b 
from 
    table1 as t1 
     inner join table2 as t2 on t1.a=t2.c 
+0

Parfois, c'est plus rapide, parfois ce n'est pas le cas. Si 'table2' est significativement plus petit que 'table1', il est souvent beaucoup plus rapide de faire' exists'. Obtenez le plan d'exécution pour des résultats concluants. – Eric

+0

@Eric: si un serveur sql "intelligent" est utilisé par rapport au plan, mais si l'optimisation SQL est limitée (par exemple sur sqlite), il est plus probable que l'optimisation sera simplement désactivée s'il y a un OU , EXISTS, etc. Prabic n'a pas tagué le serveur spécifique qu'il utilise. – dmajkic

0

Changer l'expression:

FROM Table1 WHERE a IN(SELECT c FROM Table2) 

Pour un EXISTS est une simple question de:

  1. Ajouter un WHERE à la fin de la SELECT interne

    FROM Table1 WHERE a IN(SELECT c FROM Table2 WHERE) 
    
  2. déplacer la colonne de correspondance externe (a) dans la de » WHERESELECT interne clause

    FROM Table1 WHERE IN(SELECT c FROM Table2 WHERE a) 
    
  3. déplacer la colonne de correspondance interne (b) de la clause WHERE, en laissant un espace réservé sur colonne (une constante ou *):

    FROM Table1 WHERE IN(SELECT * FROM Table2 WHERE a = c) 
    
  4. Modifier le IN-EXISTS:

    FROM Table1 WHERE EXISTS(SELECT * FROM Table2 WHERE a = c) 
    
  5. Pour être sûr ajouter le nom de la table sur la colonne interne:

    FROM Table1 WHERE EXISTS(SELECT * FROM Table2 WHERE a = Table1.c) 
    
+0

Correction du formatage du code pour vous;) – LukeH

+0

Merci. Danged si je pouvais comprendre ... – RBarryYoung

+0

THANX CHAQUE UN –