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 :

Pb requete de purge


Sujet :

Langage SQL

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    451
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 451
    Points : 287
    Points
    287
    Par défaut Pb requete de purge
    Bonjour à tous,

    ca fait un moment que je n'ai pas fait de sql et je rencontre un problème .

    J'ai 2 tables :

    table1 avec les champs suivants : poste, service
    table2 avec les champs suivants : poste, service, status

    Mon objectif est de : supprimer les tuples de la table 1 dont les couples (poste/service) sont retouvés dans la table 2 avec un status ok

    je tourne autours depuis un moment sans trouver de solution

    IN, EXISTS, JOIN???


    En fait c'est ce genre de requete que j'aimerais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    delete from table1
    where (poste, service) IN (
                    select (poste, service) 
                    from table2 
                    where status = 'ok'
                   )
    merci beaucoup pour votre aide

    Philippe

  2. #2
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Bonjour,

    Tu as essayé ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DELETE FROM table1
    WHERE (poste + service) IN (
                    SELECT (poste + service) 
                    FROM table2 
                    WHERE STATUS = 'ok'
                   )

  3. #3
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Salut,
    Sous quel SGBD travailles-tu ?
    Essaye en remplaçant le IN par = et en enlevant les parenthèses inutiles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE FROM table1
    WHERE (poste, service) = ( SELECT poste, service
     FROM table2 WHERE status = 'ok' )
    @pc75 --> Sa syntaxe est exacte, a priori, cf cours.

  4. #4
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    451
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 451
    Points : 287
    Points
    287
    Par défaut
    bonjour et merci pour vos reponses,
    je suis sous sql server

    je vais aller tester vos propositions

    @+

  5. #5
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    451
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 451
    Points : 287
    Points
    287
    Par défaut
    A priori sql server ne supporte pas cette syntaxe

    que pensez-vous de cette solution (EXISTS) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DELETE FROM table1
    WHERE EXISTS ( 
                   SELECT *
                   FROM  table2
                   WHERE table2.status = 'ok' 
                   AND table1.poste = table2.poste 
                   AND table1.service=table2.service)

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    @pc75 : je trouve dangereux d'identifier les tuples par concaténation de clef.
    Par exemple : 'rob' + 'ert' = 'robert'
    'robert' + '' = 'robert'
    (ça marche aussi avec Marcel).

    Sinon, je vote pour la solution que philippe123 s'est trouvé tout seul !

  7. #7
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    451
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 451
    Points : 287
    Points
    287
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Salut !

    @pc75 : je trouve dangereux d'identifier les tuples par concaténation de clef.
    Par exemple : 'rob' + 'ert' = 'robert'
    'robert' + '' = 'robert'
    (ça marche aussi avec Marcel).

    Sinon, je vote pour la solution que philippe123 s'est trouvé tout seul !
    je ne passe pas à coté de quelque chose???? je suis plus du tout sur de l'opérateur EXISTS...

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Points : 709
    Points
    709
    Par défaut
    Ta requête avec EXISTS est bonne. Par contre, à la place d'un "SELECT *", je mettrais un "SELECT 1" : ça évite de remonter des lignes (avec leur contenu) alors qu'on veut juste savoir s'il y en a.

    Par principe, j'aurais également inversé "table1" et "table2".

    Soit, au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DELETE FROM table1
    WHERE EXISTS ( 
                   SELECT 1
                     FROM table2
                    WHERE table2.STATUS  = 'ok' 
                      AND table2.poste   = table1.poste 
                      AND table2.service = table1.service
                 )
    EDIT: j'ai pas assez dormi et j'ai un doute pour l'inversion entre 1 et 2... quelqu'un peut me relire ?

  9. #9
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    je ne passe pas à coté de quelque chose???? je suis plus du tout sur de l'opérateur EXISTS...
    L'opérateur EXISTS est bien la en SQL et existe sous SQLServer. Par contre je ne sais pas du tout si tu peux le mettre après un delete, je pense que oui mais le mieux c'est de tester ou de voir ce que dis un pro..


    Si tu as un doute sur des fonctions SQL alors ici il y a les fonctions et si elles existent dans les differents SGBD.

  10. #10
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    451
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 451
    Points : 287
    Points
    287
    Par défaut
    Citation Envoyé par alband85 Voir le message
    Ta requête avec EXISTS est bonne. Par contre, à la place d'un "SELECT *", je mettrais un "SELECT 1" : ça évite de remonter des lignes (avec leur contenu) alors qu'on veut juste savoir s'il y en a.

    Par principe, j'aurais également inversé "table1" et "table2".

    Soit, au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DELETE FROM table1
    WHERE EXISTS ( 
                   SELECT 1
                     FROM table2
                    WHERE table2.STATUS  = 'ok' 
                      AND table2.poste   = table1.poste 
                      AND table2.service = table1.service
                 )
    EDIT: j'ai pas assez dormi et j'ai un doute pour l'inversion entre 1 et 2... quelqu'un peut me relire ?

    J'étais justement en train de me dire que ma requête allait ramer en prod! Tu es devin^^

    merci beaucoup pour votre aide


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

Discussions similaires

  1. Requete purge / import
    Par blyonnet dans le forum Développement
    Réponses: 5
    Dernier message: 16/04/2009, 21h22
  2. Problème requete de purge sur date
    Par blyonnet dans le forum Développement
    Réponses: 4
    Dernier message: 05/03/2009, 17h05
  3. requete avec OBCD et visual c++
    Par Anonymous dans le forum MFC
    Réponses: 12
    Dernier message: 18/11/2004, 17h15
  4. Requete requête sous sybase
    Par eddie dans le forum Sybase
    Réponses: 3
    Dernier message: 02/04/2003, 15h51
  5. [Kylix] Requetes Kylix pour postgres
    Par Miltown dans le forum EDI
    Réponses: 1
    Dernier message: 29/05/2002, 21h22

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