Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion: Requête Not In/Not Exists/Autre [AC-2010]

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    mars 2017
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : mars 2017
    Messages : 42
    Points : 19
    Points
    19

    Par défaut Requête Not In/Not Exists/Autre

    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 :

    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)));
    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 (((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));
    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é).

    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.

  2. #2
    Rédacteur/Modérateur
    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    6 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2004
    Messages : 6 112
    Points : 12 741
    Points
    12 741
    Billets dans le blog
    9

    Par défaut

    Bonsoir,

    Bien vérifier au niveau des parenthèses, et essayer pour simplifier Where (Not Exists(..)) and (Not Exists(..)), plutôt que Where (Exists(..)=False) and (Exists(..)=False).

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information en abondance, plein de bonnes choses à consulter sans modération

    Si vous souhaitez mettre en place une gestion de planning, une gestion de stock, de ventes/achats ou tout autre application Access, je peux vous proposer mes services.
    Pour cela n'hésitez pas à me contacter par courriel ou mp.


    Simple comme bonjour et merci

    Mes tutoriels et contributions sur ma page personnelle.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    août 2010
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 308
    Points : 488
    Points
    488

    Par défaut

    bonjour,

    il existe plusieurs solutions pour accélérer les requêtes, la plus simple est d'indexer avec doublon dans les 2 tables le 'id_prestataire_fk'

  4. #4
    Rédacteur/Modérateur

    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    janvier 2009
    Messages
    10 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 10 377
    Points : 44 332
    Points
    44 332
    Billets dans le blog
    9

    Par défaut

    Bonsoir,

    Une autre possibilité je pense, avec UNION dans une sous-requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select id_site_fk from memo where id_prestataire_fk=201 
    UNION
    select id_site_fk from local_resultats where id_prestataire_fk=201

    Puis avec une requête de non-correspondance avec la sous requête : ...LEFT JOIN... WHERE ... IS NULL (voir Comparer deux tables et rechercher des enregistrements sans correspondance)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    mars 2017
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : mars 2017
    Messages : 42
    Points : 19
    Points
    19

    Par défaut

    Citation Envoyé par f-leb Voir le message
    Bonsoir,

    Une autre possibilité je pense, avec UNION dans une sous-requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select id_site_fk from memo where id_prestataire_fk=201 
    UNION
    select id_site_fk from local_resultats where id_prestataire_fk=201

    Puis avec une requête de non-correspondance avec la sous requête : ...LEFT JOIN... WHERE ... IS NULL (voir Comparer deux tables et rechercher des enregistrements sans correspondance)
    J'ai testé cette méthode et elle fonctionne, ma requête est plus rapide maintenant, merci beaucoup !

    Pour Exists = False, il me le mettait automatiquement comme ça dès que je passais du mode SQL au mode création puis à nouveau SQL.

    Merci à tous les 3.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 05/01/2012, 10h23
  2. [AC-2003] Requête Not exists inefficace.
    Par Arcann dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 20/09/2010, 14h03
  3. [ASE 12.5.4] Optimisation requête + not existes
    Par dngaya dans le forum Adaptive Server Enterprise
    Réponses: 3
    Dernier message: 09/01/2010, 14h19
  4. Doute sur une requête NOT EXISTS
    Par CinePhil dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/03/2009, 12h00
  5. Problème requête NOT EXISTS
    Par jbulysse dans le forum SQL
    Réponses: 3
    Dernier message: 04/08/2008, 11h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo