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

Développement SQL Server Discussion :

Requete pour suppression de propagation dans liste chainée


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Par défaut Requete pour suppression de propagation dans liste chainée
    Bonjour,
    je cherche une âme généreuse pour m'éviter d'utiliser un curseur si cela est possible.....

    J'ai une liste chainée d'éléments (des dossiers)
    sur chaque dossier je peux avoir autant de "données" que je le souhaite
    Une donnée peut être propagée dans une liste chainée: on précise alors le dossier d'origine et la génération de la donnée: nombre partant de 0 et incrémenté de 1 a chaque propagation

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DOS1 ---- DOS2 ---- DOS3 ---- DOS4
       |
    DAT1
    O:DOS1
    G:0
    Ensuite, la donnée est propagée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DOS1 ---- DOS2 ---- DOS3 ---- DOS4
       |        |        |         |
    DAT1       DAT1     DAT1      DAT1
    O:DOS1     O:DOS1   O:DOS1    O:DOS1
    G:0        G:1      G:2       G:3
    On peut évidemment avoir autant de données d'origines différentes qui souhaité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DOS1 ---- DOS2 ---- DOS3 ---- DOS4
     |         |         |         |
    DAT1      DAT1      DAT1      DAT1
    O:DOS1    O:DOS1    O:DOS1    O:DOS1
    G:0       G:1       G:2       G:3
     
    DAT2      DAT2      DAT2      DAT2
    O:DOS8    O:DOS8    O:DOS8    O:DOS8
    G:4       G:5       G:6       G:7
     
              DAT3       DAT3      DAT3
              O:DOS2     O:DOS2    O:DOS2
              G:0        G:1       G:2
    J'ai ensuite une procédure qui me permet de supprimer un lien (par exemple entre DOS2 et DOS3) et je devrais donc supprimer les données propagées à partir de DOS2
    Mon problème est que je n'arrive pas a faire la requête me permettant de faire cela... Il reste la solution du curseur mais je pense qu'il est possible d'éviter

    Note: les liens entre les données et les dossiers sont fait avec une table
    DOS_DAT

    Si je veux supprimer le lien DOS2-DOS3
    la requête de suppression des données serait du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DELETE FROM DATA WHERE
     ORIGINE = (SELECT ORIGINE FROM DATA 
                     WHERE DOS_DAT.DOS = DOS2)
     AND GENERATION > (SELECT ORIGINE FROM DATA 
                                  WHERE DOS_DAT.DOS = DOS2)
    Mais la les données ORIGINE et GENERATION sont disjointes, et je ne sais pas comment faire pour dire que pour chaque donnée du dossier DOS2, il faut supprimer les données de DATA qui ont pour origine celle de la donnée du dossier 2 et une génération supérieure à celle de la donnée du dossier 2

    Ouf !

  2. #2
    Membre chevronné Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Par défaut
    Bonsoir,

    Comme ca, ca me semble difficile à comprendre sans avoir la structure de vos tables.

    Notamment après la lecture de votre derniere requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DELETE FROM DATA WHERE
    ORIGINE = (SELECT ORIGINE FROM DATA 
                     WHERE DOS_DAT.DOS = DOS2)
     AND GENERATION > (SELECT ORIGINE FROM DATA 
                                  WHERE DOS_DAT.DOS = DOS2)
    @+

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Par défaut
    Oui effectivement c'est vrai que j'ai le nez dedans mais vu de l'extérieur, il manque des données et en plus je me suis en peu emmêlé en essayant de simplifier ma vraie structure...

    Disons que mes tables sont en fait les suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DOSSIER (NUM_DOS pk)
     
    DATA (
    NUM_DATA pk
    , NUM_DOS fk
    , NUM_DOS_O --dossier origine
    , GEN -- numero de generation
    )
    Je souhaite donc faire quelque chose du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DELETE FROM DATA WHERE
    NUM_DOS_O = (SELECT NUM_DOS_O FROM DATA 
                 WHERE NUM_DOS = DOS2)
    AND GEN > (SELECT GEN FROM DATA 
               WHERE NUM_DOS = DOS2)

  4. #4
    Membre chevronné Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Par défaut
    Bonjour,

    Merci, c'est plus clair, mais pas tout à fait

    J'ai l'impression qu'il manque un élément stable dans DATA, qui serait recopié à l'identique sur toutes les générations d'une même data.

    En imaginant une colonne Stable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DELETE FROM DATA WHERE
    DATA.NUM_DOS_O = (SELECT TOP 1 NUM_DOS_O FROM DATA 
                 WHERE NUM_DOS = 2)
    AND 
    DATA.GEN > (SELECT min(A.GEN) FROM DATA A 
    WHERE A.NUM_DOS = 2 AND DATA.Stable = A.Stable)
    @+

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Par défaut
    Justement, l'élément stable c'est NUM_DOS_O qui est en fait le dossier originel dont sont issues les données propagées !

    la requête serait donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DELETE FROM DATA WHERE
     
    DATA.NUM_DOS_O = (	SELECT D1.NUM_DOS_O FROM DATA AS D1 
    					WHERE NUM_DOS = 2 AND D1.NUM_DATA = DATA.NUM_DATA)
     
    AND DATA.GEN > (	SELECT D2.GEN FROM DATA AS D2
    					WHERE D2.NUM_DOS = 2 AND D2.NUM_DATA = DATA.NUM_DATA )
    Le complexité est en fait de dire que pour chaque donnée listée sur DOS2:
    on prend le couple (origine, génération) et on supprime les données de cette
    lignée qui ont la même origine mais une génération supérieure

  6. #6
    Membre chevronné Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Par défaut
    Bonsoir,

    Ah bon. J'avais l'impression que c'était un problème croisé sur les dossiers/N° de génération.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AND DATA.GEN > 
    (SELECT D2.GEN FROM DATA AS D2
    WHERE D2.NUM_DOS = 2
    AND D2.NUM_DATA = DATA.NUM_DATA )
    NUM_DATA n'est pas la clef primaire de DATA ?

    @+

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/02/2008, 20h35
  2. Requete pour compter les points dans un championnat
    Par IG2da dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/10/2006, 18h58
  3. [Postgre Sql] requête pour suppression en cascade
    Par viny dans le forum Langage SQL
    Réponses: 1
    Dernier message: 12/10/2006, 00h39
  4. Réponses: 28
    Dernier message: 24/05/2006, 19h20
  5. Réponses: 3
    Dernier message: 01/02/2005, 00h18

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