2010-10-07 12 views
1

J'ai une requête où j'utilise une sous-requête, et je voudrais réécrire dans une jointure, pour avoir de meilleures performances.Comment réécrire une sous-requête pour utiliser des jointures lorsque vous avez utilisé DISTINCT dans la sous-requête?

La sous-requête utilise DISTINCT car il existe de nombreux enregistrements, et le problème que j'ai est qu'ils se retrouvent plusieurs fois dans la jointure lorsque j'utilise la jointure.

Alors, comment puis-je réécris une requête comme celui-ci à utiliser rejoindre:

SELECT * 
FROM table1 a 
     JOIN table2 b 
     ON b.field1 = a.field1 
WHERE b.field3 = 1531 
     AND a.field4 = 0 
     AND a.field5 IN (SELECT DISTINCT field5 
         FROM table3 
         WHERE field6 = 172) 

Répondre

2

Quelque chose comme:

SELECT * 
FROM table1 a 
     JOIN table2 b ON b.field1 = a.field1 
     JOIN (SELECT DISTINCT field5 
         FROM table3 
         WHERE field6 = 172) C 
     ON C.field5 = a.field5 

WHERE b.field3 = 1531 AND a.field4 = 0 

Il est difficile de dire sans voir les données réelles, donc si cela ne travaillez, s'il vous plaît faites le moi savoir.

+0

n'est pas après que JOIN soit une table? –

+0

@Srinivas - si vous demandez si c'est la syntaxe légale, oui, vous pouvez joindre au résultat d'une autre requête select comme s'il s'agissait d'une table. Je ne sais pas si c'est ANSI-92 ou pas si; Je regarde mon propre code MS SQL Server. –

+0

la requête est correcte, après JOIN il y a une table qui est incluse dans un(), c'est la sous-requête, qui calcule la table. – Pentium10

0

Relocalisez le mot-clé DISTINCT à la clause SELECT dans la requête principale, par ex.

SELECT DISTINCT a.*, b.* 
FROM table1 a 
     JOIN table2 b 
     ON b.field1 = a.field1 
     JOIN table3 c 
     ON a.field5 = c.field5 
WHERE b.field3 = 1531 
     AND a.field4 = 0 
     AND c.field6 = 172; 

Vous devriez examiner l'utilisation de SELECT * dans votre requête à savoir ne pas les meilleures pratiques.