IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Requêtes et SQL. Discussion :

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


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2017
    Messages
    45
    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 : 45
    Points : 24
    Points
    24
    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
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    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 accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  3. #3
    Invité
    Invité(e)
    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
    Responsable Arduino et Systèmes Embarqués


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    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
    45
    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 : 45
    Points : 24
    Points
    24
    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