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

SQL Oracle Discussion :

SELECT FROM .. NOT IN ?


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Points : 16
    Points
    16
    Par défaut SELECT FROM .. NOT IN ?
    Bonjour à tous, j'aimerais récupérer tous les résultats que cette requête ne donne pas, donc j'utilise un NOT IN mais ça ne fonctionne pas, j'ai une erreur : ORA-00933: La commande SQL ne se termine pas correctement

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT base2.NAME, base2.FSTNAME, base2.PNT, base2.MAT, base2.COL
    FROM p_ctc@lkb1b2 base2
    NOT IN (SELECT base1.NOM, base1.PRENOM, base1.DEP, Translate(Lower(base1.NOM), 'àãâäçéèêëîïôöûüù _-^¨"''', 'aaaaceeeeiioouuu'), Translate(Lower(base1.PRENOM),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu'), base2.NAME, base2.FSTNAME, base2.PNT, base2.MAT, base2.COL, Translate(Lower(base2.NAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu'), Translate(Lower(base2.FSTNAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')
          FROM pers.AGT base1, p_ctc@lkb1b2 base2
          WHERE Translate(Lower(base1.NOM), 'àãâäçéèêëîïôöûüù _-^¨"''', 'aaaaceeeeiioouuu') = Translate(Lower(base2.NAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')
          AND Translate(Lower(base1.PRENOM),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu') = Translate(Lower(base2.FSTNAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')
          ORDER BY base1.NOM, base1.PRENOM);
    Merci de votre aide.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Vous avez un problème de syntaxe, NOT IN s'utilise comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT t1.col1 ...
    FROM t1
    WHERE (t1.col1[,t1.col2 ...]) NOT IN (SELECT col1[, col2 ...] FROM ...);
    Si vous nous decrivez vos tables, et ce que vous souhaitez faire, nous pourrons sans doute vous en dire plus.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Le problème est que je n'ai pas besoin de where.
    Je dois comparer des personnes de deux bases différentes, la requête qui commence apres le not in me donne une liste des personnes présentes dans les deux bases, moi je veux récupérer les personnes qui ne sont pas présentes dans la base 1 par rapport à la base 2, et ma seule solution et de faire un not in, mais je ne sais pas quoi mettre dans la clause where ...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Ca pourrait ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT base1.NOM, base1.PRENOM, base1.DEP
    FROM pers.AGT base1
    WHERE (Translate(Lower(base1.NOM), 'àãâäçéèêëîïôöûüù _-^¨"''', 'aaaaceeeeiioouuu'), Translate(Lower(base1.PRENOM),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')) 
          NOT IN (SELECT Translate(Lower(base2.NAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu'), Translate(Lower(base2.FSTNAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu') FROM p_ctc@lkb1b2 base2);
    Ou avec un NOT EXISTS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT base1.NOM, base1.PRENOM, base1.DEP
    FROM pers.AGT base1
    WHERE NOT EXISTS 
    ( 
     SELECT *
     FROM p_ctc@lkb1b2 base2
     WHERE Translate(Lower(base1.NOM), 'àãâäçéèêëîïôöûüù _-^¨"''', 'aaaaceeeeiioouuu') = Translate(Lower(base2.NAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')
     AND Translate(Lower(base1.PRENOM),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu') = Translate(Lower(base2.FSTNAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')
    );

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Ca fonctionne mais je n'ai aucune ligne renvoyée

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT base2.NAME, base2.FSTNAME, base2.PNT, base2.MAT, base2.COL
    FROM p_ctc@lkb1b2 base2
    WHERE NOT EXISTS ( 
    SELECT *
    FROM pers.AGT base1, p_ctc@lkb1b2 base2 
    WHERE Translate(Lower(base1.NOM), 'àãâäçéèêëîïôöûüù _-^¨"''', 'aaaaceeeeiioouuu') = Translate(Lower(base2.NAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')
    AND Translate(Lower(base1.PRENOM),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu') = Translate(Lower(base2.FSTNAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu'));

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Vous n'avez pas besoin des deux tables dans la sous-requete du NOT EXISTS.
    Avez vous au moins testé telles quelles les requêtes que je vous ai postées?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    J'ai remodelé un peut et ça fonctionne, par contre c'est très lent !

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT base2.NAME, base2.FSTNAME, base2.PNT, base2.MAT, base2.COL
    FROM p_ctc@lkb1b2 base2
    WHERE NOT EXISTS 
    ( 
      SELECT *
      FROM pers.AGT base1
      WHERE Translate(Lower(base1.NOM), 'àãâäçéèêëîïôöûüù _-^¨"''', 'aaaaceeeeiioouuu') = Translate(Lower(base2.NAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')
      AND Translate(Lower(base1.PRENOM),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu') = Translate(Lower(base2.FSTNAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')
    );
    Merci beaucoup

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Si vous avez beaucoup de ligne, c'est normal.
    Sur une recherche de ce type, il faudrait définir sur les deux tables des index sur les fonctions (Translate(Lower(NOM), 'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu'),Translate(Lower(PRENOM),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')).

    Si vous lancez cette requête occasionnellement, ça n'en vaut peut être pas la peine (tout dépend aussi de ce que veut dire très lent, car ce n'est pas une unité de mesure).
    Si elle est destinée à être exécutée régulièrement, penchez vous sur l'indexation.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    La requête ne m'envoie pas les résultats attendu ...
    J'aimerais que cette requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT b1.NOM, b1.PRENOM
    FROM base1 b1, base2@lkb1b2 b2
    WHERE b2.dpm != '0'
    AND b1.COD(+) = b2.Num
    ORDER BY b1.NOM, b1.PRENOM;
    Soit "soustraite" à celle la :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT b1.NOM, b1.PRENOM
    FROM base1 b1, base2@lkb1b2 b2
    WHERE b2.dpm != '0'
    AND b1.COD = b2.Num
    ORDER BY b1.NOM, b1.PRENOM;
    Pour avoir la différence entre les deux.
    J'ai essayé avec un not exists mais je ne pense pas que ça fonctionne car quand j'exécute la première j'ai 5782 résultats, avec la deuxième j'en ai 5181, avec mon not exist je me retrouve avec plus de 7000 lignes, alors qu'avec une requête de différence je devais avoir les 601 lignes différentes entre les deux.
    Merci de votre aide.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Vous pouvez utiliser MINUS entre les deux requêtes, en enlevant les ORDER BY.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Merci beaucoup

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

Discussions similaires

  1. [COUNT] select ... from ... where count !
    Par tmcgrady dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/11/2007, 17h29
  2. [insert][select] Subqueries not allowed
    Par Invité dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/09/2005, 11h56
  3. un SELECT FROM ????
    Par tarik75 dans le forum Langage SQL
    Réponses: 18
    Dernier message: 17/07/2005, 12h04
  4. Equivalent du Select * from ::Fn_Fonction()
    Par WOLO Laurent dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/07/2004, 09h48

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