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 :

Suppression ligne n si n-1 n'existe pas


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de hammag
    Profil pro
    Inscrit en
    Février 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 511
    Par défaut Suppression ligne n si n-1 n'existe pas
    bonjour tout le monde,

    je cherche une requête pour supprimer une ligne dans une table qui a un champ de séquence = N si la ligne N-1 n'est pas présente dans cette table.

    Exemple:
    .
    .
    Ligne N-1 : champ1, champ2, champ_séquence=3
    Ligne N : champ1, champ2, champ_séquence=4
    dans ce cas la ligne 4 ne sera pas supprimée.

    2ème cas:
    .
    .
    Ligne N-1 : champ1, champ2, champ_séquence=2
    Ligne N : champ1, champ2, champ_séquence=4
    dans ce cas la ligne 4 sera supprimée.

    Merci d'avance.

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Que doit il se passer si tu as 2 4 et 5 ?

    4 doit etre supprimé car il n'y a pas 3
    5 ne doit pas etre supprimé car il y a 4

    mais quand 4 est supprimé 5 devra aussi etre supprimé ?

  3. #3
    Membre éclairé Avatar de hammag
    Profil pro
    Inscrit en
    Février 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 511
    Par défaut
    tout à fait, tu as raison
    si tu as 2 4 5, les 4 et 5 seront supprimées.

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Billets dans le blog
    1
    Par défaut
    Donc le besoin est de garder la suite continue qui commence a la sequence la plus petite ?

    Je suppose que la plus petite sequence ne doit pas etre supprimée sinon on supprime tout ?

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Au lieu du select, passer un delete
    et le faire tant qu'on delete au moins une ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH t AS (SELECT 1 champ1, 2 champ2, 3 seq FROM dual
    UNION ALL SELECT 1 champ1, 2 champ2, 4 seq FROM dual
    UNION ALL SELECT 2 champ1, 2 champ2, 2 seq FROM dual
    UNION ALL SELECT 2 champ1, 2 champ2, 4 seq FROM dual
    UNION ALL SELECT 2 champ1, 2 champ2, 5 seq FROM dual
    		)
    SELECT * FROM t a
    WHERE EXISTS (SELECT 1 FROM t b WHERE b.champ1 = a.champ1 AND b.champ2 = a.champ2 AND b.seq < a.seq)
    AND NOT EXISTS (SELECT 1 FROM t b WHERE b.champ1 = a.champ1 AND b.champ2 = a.champ2 AND b.seq = a.seq - 1)
     
     
    CHAMP1	CHAMP2	SEQ
    2	2	4

  6. #6
    Membre éclairé Avatar de hammag
    Profil pro
    Inscrit en
    Février 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 511
    Par défaut
    bien sur la ligne avec la petite séquence ne doit pas être supprimée.
    Normalement c'est la ligne avec la séquence 1.

  7. #7
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    delete TABLE
    where seq > (select min (seq)
                 from TABLE T1
                 where not exists (select 1
                                   from TABLE T2 
                                   where T2.seq = T1.seq + 1
                                   )
                 )

  8. #8
    Membre éclairé Avatar de hammag
    Profil pro
    Inscrit en
    Février 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 511
    Par défaut Suppression des lignes dans une table suivant une deuxième table
    Bonjour,

    j'ai deux tables tab1 et tab2, je cherche une requête pour supprimer chaque ligne dans la 1ere table qui a la séquence = N si la ligne N-1 n'est pas présente dans la 2eme table.

    voici un exemple pour illustrer mon problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TAB1                       TAB2
    5			        1
    6				2
    				3
    Normalement les deux lignes 5 et 6 dans TAB1 doivent être supprimées dans TAB1, parceque la ligne 4 n'est pas présente dans TAB2.

    voici d'abord ma requête:
    Code : 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
    17
    18
    19
    20
     
       DELETE 
       FROM TAB1 A 
       WHERE ( A.CHAMP1, A.CHAMP2 ) IN(SELECT B.CHAMP1 , B.CHAMP2 
    								   FROM TAB2 B 
    								   WHERE B.CHAMP1 = A.CHAMP1 
    								   AND B.CHAMP2 = A.CHAMP2 
    								   AND NOT EXISTS (SELECT SEQ 
    												   FROM TAB2 
    												   WHERE CHAMP1 = A.CHAMP1 
    												   AND CHAMP2 = A.CHAMP2 
    												   AND SEQ = A.SEQ -1 
    												   ) 
    								   AND NOT EXISTS (SELECT SEQ 
    												   FROM TAB1 
    												   WHERE CHAMP1 = A.CHAMP1 
    												   AND CHAMP2 = A.CHAMP2 
    												   AND SEQ = A.SEQ -1 
    												   ) 
    									)
    mon problème c'est que la ligne 5 est supprimée mais la ligne 6 n'est pas supprimée(parce que la ligne 5 est présente dans TAB1).

    pour corriger ce pb, j'ai mis OR à la place de AND (en gras):
    Code : 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
    17
    18
    19
    20
     
       DELETE 
       FROM TAB1 A 
       WHERE ( A.CHAMP1, A.CHAMP2 ) IN(SELECT B.CHAMP1 , B.CHAMP2 
    								   FROM TAB2 B 
    								   WHERE B.CHAMP1 = A.CHAMP1 
    								   AND B.CHAMP2 = A.CHAMP2 
    								   AND NOT EXISTS (SELECT SEQ 
    												   FROM TAB2 
    												   WHERE CHAMP1 = A.CHAMP1 
    												   AND CHAMP2 = A.CHAMP2 
    												   AND SEQ = A.SEQ -1 
    												   ) 
    								   OR NOT EXISTS (SELECT SEQ 
    												   FROM TAB1 
    												   WHERE CHAMP1 = A.CHAMP1 
    												   AND CHAMP2 = A.CHAMP2 
    												   AND SEQ = A.SEQ -1 
    												   ) 
    									)
    cette fois les deux lignes 5 et 6 sont supprimées,
    mais cela créer le pb suivant:
    TAB1 TAB2
    4 1
    5 2
    6 3
    [/CODE]
    les trois lignes 4, 5 et 6 sont supprimées.

    quelqu'un pourrait-il m'aider svp?

  9. #9
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 063
    Par défaut
    Bonjour,

    Quel SGBD ? Parce que la syntaxe peut éventuellement changer selon le SGBD...
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  10. #10
    Membre éclairé Avatar de hammag
    Profil pro
    Inscrit en
    Février 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 511
    Par défaut
    Oracle 10g

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    et tout simplement ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    delete from tab1 a
    where not exists (select 1 from tab2 b where a.seq = b.seq -1);
    Ca répond à l'énoncer + exemple donné, maintenant vu vos requête je penses que vous avez omis la moitié du problème dans votre explication.

  12. #12
    Membre éclairé Avatar de hammag
    Profil pro
    Inscrit en
    Février 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 511
    Par défaut
    bonjour punkoff,

    ta réponse ne résout pas le problème suivant:

    TAB1
    4
    5

    TAB2
    1
    2
    3



    ta requête ne supprime pas le 4(ce qui est ok:3 présent dans tab2) mais supprime le 5, parce que le 4 n'existe pas dans TAB2.
    Mais le 4 existe dans TAB1, donc il ne faut pas supprimer le 5.
    donc, il ne faut supprimer la ligne N si la ligne n-1 se trouve dans tab1 ou tab2.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/07/2012, 14h35
  2. [BATCH] Suppression Ligne
    Par kilian dans le forum Windows
    Réponses: 2
    Dernier message: 24/05/2006, 14h02
  3. [VBA][EXCEL] pb suppression ligne
    Par megapacman dans le forum Access
    Réponses: 2
    Dernier message: 06/04/2006, 13h34
  4. [JTable] probleme suppression ligne
    Par lilou77 dans le forum Composants
    Réponses: 1
    Dernier message: 01/11/2005, 10h34

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