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

Oracle Discussion :

problème requete : DELETE pr0 WHERE num1 in(select ..


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 64
    Points : 48
    Points
    48
    Par défaut problème requete : DELETE pr0 WHERE num1 in(select ..
    Bonjour,
    j'ai cette requète :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select pr0.num1 from pr0 where pr0.num1 is not null 
    minus
    select pr0.num1 from pm0, pr0 where pm0.nrid = pr0.num1
    elle me ramène 16 enregistrements

    Je veux supprimer ces 16 enregistrements en une seule requète. J'ai donc fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DELETE pr0 WHERE pr0.num1 in(select pr0.num1 from pr0 minus select 
    pr0.num1 from pm0, pr0 where pm0.nrid = pr0.num1)
    mais ça me supprimer 875 enregistrements. Je ne comprends pas pourquoi.

    De plus, j'aurais aimer faire une requète sans "IN" (trop long à l'exécution). Est ce que cette requète ferais la même chose que la mienne ? (je comprends pas bien comment marche le "EXISTS"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DELETE pr0 WHERE EXISTS(select pr0.num1 from pr0 minus select 
    pr0.num1 from pm0, pr0 where pm0.nrid = pr0.num1
    )

    Merci d'avance pour vos réponses

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    tu as vu que ta clause "pr0.num1 IS NOT NULL " est passée à la trape entre ton select et ton delete ??

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Attention, le MINUS te fait un DISTINCT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (SELECT 1 as col FROM DUAL UNION ALL SELECT 1 FROM DUAL)
    MINUS 
    SELECT 2 FROM DUAL
    Te renvoie 1 ligne.

    Ta requete est équivalente à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT pr0.num1 
    FROM pr0 
    WHERE pr0.num1 IS NOT NULL
    AND NOT EXISTS (SELECT 1 FROM pm0 WHERE pm0.nrid = pr0.num1)

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Il y a des quelque chose de redondant dans ta requête car tu demande des enregistrement de pr0 qui sont dans la requête portant elle meme sur pr0, (soustrait de ceux étant présent dans pm0).
    C'est un peu dire "je veux supprimer les lignes de ma table qui d'une part sont dans ma table, et d'autre part ne sont pas dans la table pm0". Je pense qu'il est plus simple de dire "je veux supprimer des enregistrement de ma table pr0 qui ne sont pas dans pm0".

    Si ta clause "NOT NULL" est toujours valable, il ne faut pas supprimer les null, mais ceci sera implicite car les null sont éliminés de toute jointure.

    ça donnerait donc un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE from PR0 where NOT EXISTS
      ( SELECT 1 from PM0 where PR0.NUM1 = PM0.NRID)

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par McM
    Attention, le MINUS te fait un DISTINCT ...
    Ah oui, c'est en effet la bonne explication, la clause "NOT NULL" était de toute façons implicite dans les 2 cas....

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 64
    Points : 48
    Points
    48
    Par défaut
    Merci Beaucoup. Je ne savais pas que le MINUS faisait un distinct.

    De toute façon je n'en aurait plus besoin je vais prendre la dernière requète qui m'a l'air pas mal .

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 64
    Points : 48
    Points
    48
    Par défaut
    euh par contre je ne vois pas trop ce que veut dire le 1 dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 1 FROM pm0, pr0 WHERE pr0.NUM1 = pm0.NRID

  8. #8
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Dans le cas du exists tout ce que tu veux que ta sous-requête te ramène quelquechose pour vérifier que le résultat existe. Après ce quelquechose ça peut être 1, 'TOTO' ou n'importe quoi c'est pareil.

    J'imagine qu'on met 1 pour des raisons de performances, à tort ou à raison je n'en sais rien.

  9. #9
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par nuke_y
    J'imagine qu'on met 1 pour des raisons de performances, à tort ou à raison je n'en sais rien.
    moi non plus j'en sais rien si c'est vraiment plus performant de mettre 1 ou une colonne ou *, j'ai l'impression que c'est pareil en fait...
    y'en a meme qui mettent "select null", mais moi ça me gène d'écrire que ramener une ligne avec le champ "rien" soit ramener "quelque chose"

  10. #10
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    En fait si vous mettez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NOT EXISTS (SELECT pr0.NUM1 FROM...)
    vous obligez Oracle à lire les blocks de données.

    Si vous avez des indexes qui vont bien pour la sous requete, Oracle n'a pas besoin de lire les blocks de donnée si vous mettez un *, 1, NULL, 'Toto', '*', '', etc..

    Une constante quoi.

    PS : Moi aussi le SELECT NULL me gêne. Bien que NULL soit une valeur au sens Oracle.

  11. #11
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par McM
    ...

    PS : Moi aussi le SELECT NULL me gêne. Bien que NULL soit une valeur au sens Oracle.
    Surtout que c'est le genre de gag succeptible d'avoir un comportement différent selon les SGBD...

Discussions similaires

  1. Problème requete DELETE
    Par om-player dans le forum VBA Access
    Réponses: 2
    Dernier message: 09/01/2008, 14h28
  2. Problème requete delete
    Par label55 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/12/2007, 15h32
  3. Problème requete SELECT
    Par andy38 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 03/07/2007, 10h58
  4. Problème requete SELECT
    Par fabpeden dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/05/2007, 10h17
  5. problème requete select
    Par chtiot dans le forum Langage SQL
    Réponses: 4
    Dernier message: 20/03/2006, 15h09

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