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 :

Aide sur requete DELETE


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Aide sur requete DELETE
    Bonjour à tous !

    J'essaye de transformer la requête SQLserveur ci-dessous en requête Oracle SQL :
    Après plusieurs tentative et pas mal de recherche, je ne comprend pas comment la faire marcher :


    SQLserveur (marche) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DELETE T_BT
    FROM T_BT
    LEFT JOIN(
    SELECT MIN(NUM_BT) as id, cle_ip, date_h_deb_prevu
    FROM T_BT
    GROUP BY cle_ip, date_h_deb_prevu
    ) AS table_1
    ON T_BT.NUM_BT = table_1.id
    WHERE table_1.id IS NULL

    Transformation en Oracle SQL après mes recherches/tests (ne marche pas, help please !) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DELETE FROM T_BT
    WHERE EXISTS
    ( SELECT MIN(NUM_BT) as id, cle_ip, date_h_deb_prevu
    FROM T_BT
    GROUP BY cle_ip, date_h_deb_prevu ) tb1
    ON t_bt.num_bt = tb1.id
    WHERE  tb1.id IS NULL
    Voici l'erreur en question :
    Erreur à la ligne de commande : 5, colonne : 36
    Rapport d'erreur :
    Erreur SQL : ORA-00933: la commande SQL ne se termine pas correctement



    J'ai tordu le sujet dans tous les sens mais je n'y arrive pas

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    La requête initiale me semble étrange, mais bon si j'ai bien compris son fonctionnement, vous pouvez essayer comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    delete from t_bt
     where not exists (select 1
                         from t_bt tb1
                        group by tb1.cle_ip, tb1.date_h_deb_prevu 
                       having min(tb1.num_bt) = t_bt.num_bt);
    Mais je trouve étrange de grouper par CLE_IP, DATE_H_DEB_PREVU et de ne pas l'utiliser dans la jointure....

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour skuatamad,

    Merci pour ta réponse,
    Ton code compile mais tourne en boucle sur mon serveur de test (stop au bout de 10min).

    Pour ta question de groupe, peut être tu aura la réponse ci dessous :

    Problème initial : Il y a des doublons dans la BDD,

    Solution du support pour les supprimer :
    • La première requête marche bien en Oracle SQL ( sauf le GO, je sais pas à quoi il sert) ==> 164 entrées trouvées
    • La deuxième est KO, elle doit supprimer les doublons des 164 entrées j'imagine.


    Quand j'ai dis qu'elle est OK c'est en SQLserveur vu que c'est ce que m'a donné le support.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    SELECT COUNT(cle_ip), cle_ip, date_h_deb_prevu
    FROM T_BT
    GROUP BY cle_ip, date_h_deb_prevu
    HAVING COUNT(cle_ip) > 1
    AND cle_ip <> 100000
    GO
     
    DELETE T_BT
    FROM T_BT
    LEFT JOIN(
    SELECT MIN(NUM_BT) as id, cle_ip, date_h_deb_prevu
    FROM T_BT
    GROUP BY cle_ip, date_h_deb_prevu
    ) AS table_1
    ON T_BT.NUM_BT = table_1.id
    WHERE table_1.id IS NULL


    As-tu une autre idée, où bien le support ne m'a pas donné un bon "delete" ?

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Je pense effectivement qu'il faudrait corréler la sous-requête, donc modifier la version oracle comme suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    delete from t_bt
     where not exists (select 1
                         from t_bt tb1
                        where tb1.cle_ip = t_bt.cle_ip
                          and tb1.date_h_deb_prevu = t_bt.date_h_deb_prevu
                        group by tb1.cle_ip, tb1.date_h_deb_prevu 
                       having min(tb1.num_bt) = t_bt.num_bt);
    Pour les perfs vous pouvez créer un index sur (cle_ip, date_h_deb_prevu) avant d'exécuter le DELETE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create index idx_t_bt_cle_date on t_bt (cle_ip, date_h_deb_prevu);
    PS : Vérifiez bien la table après suppression avant de commit.

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour ton aide,

    Je n'ai pas les droits pour indexer la table, mais je vais laisser tourner demain toute la journée et voir ce que ça donne

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Ou peut être plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    delete from t_bt
     where t_bt.num_bt <> (select min(tb1.num_bt)
                             from t_bt tb1
                            where tb1.cle_ip = t_bt.cle_ip
                              and tb1.date_h_deb_prevu = t_bt.date_h_deb_prevu);
    Ou alors, si vous vous fichez du num_bt à conserver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    delete from t_bt
     where t_bt.rowid <> (select min(tb1.rowid)
                             from t_bt tb1
                            where tb1.cle_ip = t_bt.cle_ip
                              and tb1.date_h_deb_prevu = t_bt.date_h_deb_prevu);

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci infiniment skuatamad,

    La dernière requête a marché en moins de 5 minutes,

    Je vais voir maintenant si il a bien supprimé ce qu'il faut

    Bonne journée !

  8. #8
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    C'est bon ça marche !

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

Discussions similaires

  1. aide sur requete delete
    Par DJERDJAR YACINE dans le forum Requêtes
    Réponses: 5
    Dernier message: 07/07/2007, 08h21
  2. Aide sur requete access
    Par Al soltani dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 02/03/2006, 11h58
  3. Besoin d'aide sur requetes imbriquées simples
    Par Kyti dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/03/2006, 10h52
  4. Aide sur requete PHP vers MySQL
    Par pounie dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/02/2006, 15h12
  5. aide sur requete mysql
    Par digger dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/01/2006, 10h54

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