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

Langage SQL Discussion :

Chercher la non présence d'une donnée


Sujet :

Langage SQL

  1. #1
    En attente de confirmation mail
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Points : 112
    Points
    112
    Par défaut Chercher la non présence d'une donnée
    Bonjour,

    Je vous explique mon problème :
    J'ai une table contenant plusieurs dizaine de milliers de lignes qui est composé comme ceci :
    NUMERO
    ======
    num_1
    num_2
    num_3
    num_4
    Pour l'instant rien de bien compliqué...puis j'ai un ensemble de nombre, par exemple

    num_1
    num_2
    num_4
    J'aimerai avoir une requete qui me retourne les numéros qui ne sont pas dans ma liste, par exemple pour ici : num_3...

    J'ai essayé de généré un fichier sql pour chaque numéro de ma liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct 'ok' from pgw_customer where EXTERNAL_ID NOT IN('324322')
    mais c'est beaucoup beaucoup trop lent!!

    Merci d'avance pour vos réponses!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    J'ai nommé la table avec plusieurs milliers de ligne grosse_table et la table contenant la liste des numéro liste_numero.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT numero FROM grosse_table G
    left outer join liste_numero L on L.numero=G.numero
    where L.numero is null;
    En revanche cela sera lent si tu n'as pas d'index sur numero dans grosse_table.
    A+
    Soazig

  3. #3
    En attente de confirmation mail
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par soazig Voir le message
    Bonjour,
    J'ai nommé la table avec plusieurs milliers de ligne grosse_table et la table contenant la liste des numéro liste_numero.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT numero FROM grosse_table G
    left outer join liste_numero L on L.numero=G.numero
    where L.numero is null;
    En revanche cela sera lent si tu n'as pas d'index sur numero dans grosse_table.
    A+
    Soazig
    Ah..excuse moi, j'ai oublié de préciser que ma deuxième liste n'était pas une table mais une variable, chaque numéro est une variable Shell...Par exemple si on reprends ma première requête, ça donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT 'ok' FROM pgw_customer WHERE EXTERNAL_ID NOT IN('${varaible_ksh}')
    Merci

  4. #4
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    tu ne peux pas mettre toute ta liste dans un seul 'NOT IN' ?

  5. #5
    En attente de confirmation mail
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Points : 112
    Points
    112
    Par défaut
    c'est une liste de 150 000 numéros en principe...et ça pourrait monter à 600 000...
    c'est un peu beaucoup, nan ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    A mon avis la solution avec une table éventuellement temporaire contenant la liste des numéros est la plus simple.
    Quand je dis temporaire, rien ne t'empêche de créer une vrai table au début du traitement, de la remplir par boucle dans ton shell et de la dropper après le select que je t'ai proposé.
    En créant éventuellement le temps du traitement un index sur numero dans grosse table.

    PS : A part si j'ai mal compris avec ta requête exemple tu ne peux avoir que les numéros de ta liste de numéros qui sont dans grosse_table, (tu récupère OK s'il ne sont pas dans grosse table). Or je pensais que tu voulais les numéros de grosse tables qui ne sont pas dans ta liste, et c'est ce que fait ma requête.

    a+
    Soazig

  7. #7
    Nouveau membre du Club
    Inscrit en
    Novembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    salut

    tu peux tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT numero FROM grosse_table G
    WHERE G.numero NOT IN SELECT(  liste_numero.numero)
    d'ou Groose table est ta table origonale
    et list_numero une table contient la liste de numero dont tu veux verfier

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Rebonjour,
    Pour répondre à abdallahi, il me semble avoir lu que pour les performances il vaut mieux faire un left join avec clé is null plutôt que d'utiliser un not in.
    A+
    Soazig

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 922
    Points : 51 717
    Points
    51 717
    Billets dans le blog
    6
    Par défaut
    Il n'y a pas de règle stricte en matière de performances. Seul compte la vérification du coût d'exécution ou du coût estimé de la requête. Donc OUTER JOIN ... IS NULL ou NOT IN ou NOT EXISTS, tout est valable, mais il faut mesurer la chose.

    Bien évidemment la solution avec une table temporaire indexée, et la table primaire elle aussi indexées sur cette colonne est la solution qui sera la plus rapide puisque le moteur pourra faire un MERGE ou un NESTED LOOP pour résoudre la jointure.

    A +

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/09/2010, 16h32
  2. Réponses: 10
    Dernier message: 27/08/2010, 12h04
  3. [MySQL] Vérification de la non présence d'une valeur
    Par popy67 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 05/04/2009, 15h12
  4. [MySQL] Vérification de la présence d'une donnée déficiente
    Par sanaa16 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 08/06/2008, 02h17
  5. [XSLT] Tester la non présence d'une valeur dans un fichier
    Par arnauann dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/01/2007, 16h29

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