Bonjour à tous,
J'aurais besoin de votre aide pour une requête qui me pose problème.
J'aurais besoin de sortir une liste d'ID qui ne se trouvent pas dans 2 autres tables. Pour cela, j'ai fait des requêtes en "Not In" mais bien évidemment ceux-ci sont très lentes et je souhaiterai obtenir le même résultat mais en plus rapide, j'ai essayé avec "Not Exists" -> requête plus rapide mais celle-ci ne donne pas exactement le même nombre de résultats.
Pour faire simple, je dispose de 3 tables :
local_sites : id_site (PRIMARY KEY, AI)
memo : id_memo (PRIMARY KEY, AI), id_prestataire_fk, id_site_fk
local_resultats : id_resultat (PRIMARY KEY, AI), id_prestataire_fk, id_site_fk
Je voudrais extraire tous les id_site qui ne sont ni dans le memo ni dans local_resultats par rapport à un id_prestataire_fk (exclure uniquement les lignes qui ont id_prestataire_fk=201 par exemple dans les 2 tables)
La requête en "Not In" devient donc :
Celle en "Not Exists" en même temps :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT local_sites.id_site FROM local_sites WHERE (((local_sites.id_site) Not In (select id_site_fk from memo where id_prestataire_fk=201) And (local_sites.id_site) Not In (select id_site_fk from local_resultats where id_prestataire_fk=201)));
J'ai simplifié la requête au plus simple pour obtenir de l'aide facilement (il y a d'autres champs a ajouter + d'autres critères mais ceux-ci n'impactent pas la rapidité).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT local_sites.id_site FROM local_sites WHERE (((Exists (select id_site_fk from memo where memo.id_site_fk = local_sites.id_site and memo.id_prestataire_fk=201))=False) AND ((Exists (select local_resultats.id_site_fk FROM local_resultats where local_resultats.id_site_fk = local_sites.id_site AND ((local_resultats.id_prestataire_fk)=201)))=False));
Auriez-vous une idée pour améliorer la requête pour qu'elle soit plus rapide ? J'ai essayé d'être le plus précis possible.
Merci d'avance.
Partager