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

Sybase Discussion :

[ASE][T-SQL] Update récursif ?


Sujet :

Sybase

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 43
    Points : 30
    Points
    30
    Par défaut [ASE][T-SQL] Update récursif ?
    Bonjour,

    J'ai une table avec les informations suivantes :

    ID1 | MASTER
    162 | 911159
    25279 | 0
    911159 | 25279

    la colonne master indique quel est l'enregistrement maitre.

    Je souhaite que le master soit toujours le plus petit ID, soit en fait obtenir la table suivante
    ID1 | MASTER
    162 | 0
    25279 | 162
    911159 | 162

    Avez-vous une idée (astuces) afin de parvenir à ce résultat en un minimum de requete.
    Actuellement, j'exécute 4 requêtes successives pour arriver au résultat.

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 554
    Points
    19 554
    Billets dans le blog
    25
    Par défaut
    je ne comprends pas comment vous obtenez les 2 dernières lignes !
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    la ligne 162 à 911159 comme master, qui pointe lui-même sur le 25279, donc le 162 à 25279 comme master soit :

    162 | 25249
    25279 | 0
    911159 | 25279

    Mais je désire que le master soit l'enregistrement dont l'ID est le plus petit, donc comme le 162 pointe sur 25249, on inverse car il est plus petit
    162 | 0
    25279 | 162

    De même pour la ligne 911159 qui pointe sur 25279 qui lui pointe sur 162, donc :
    911159 | 162

    au final :
    162 | 0
    25279 | 162
    911159 | 162

    J'espère que c'est assez clair

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    Pour compléter, j'ai la table suivante :

    ID | MASTER
    1 | 3
    2 | 3
    3 | 1
    4 | 2
    10 | 12
    11 | 12
    12 | 11
    20 | 21
    21 | 20
    22 | 20

    je souhaite donc obtenir une table dont le(s) master(s) est l'enregistrement dont l'Id est le plus petit, soit la table finale :
    ID | MASTER
    1 | 0
    2 | 1
    3 | 1
    4 | 1
    10 | 0
    11 | 10
    12 | 10
    20 | 0
    21 | 20
    22 | 20

    Le master = 0 signifiant qu'il ne pointe sur aucun autre enregistrement (donc le master !)
    Avez-vous une solution en effectuant le moins de requete possible ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    C'est bon, j'ai trouvé :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    create table #group
    (ID_GROUP numeric(9,0),
    ID numeric(9,0))
     
    insert into
        #group 
    select
        D_MASTER, ID_CONTACT
    from
        #CONTACTS
    where
        ID_CONTACT < D_MASTER
        AND D_MASTER > 0
     
    insert into
        #group
    select
        ID_GROUP, ID_CONTACT
    from
        #CONTACTS, #group
    where
        ID_CONTACT > D_MASTER
        AND D_MASTER = #group.ID
        AND D_MASTER > 0
     
    -- Creation d'une seconde table pour stockée le master de chaque groupe
    select ID_GROUP, min(ID) as MASTER
    into #group2
    from #group
    group by ID_GROUP
     
    update
        #CONTACTS
    set
        D_MASTER = MASTER
    from
    	#group, #group2
    where #CONTACTS.ID_CONTACT = #group.ID and #group.ID_GROUP=#group2.ID_GROUP

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

Discussions similaires

  1. [ASE][T-SQL] Optimisation d'un update
    Par metheorn dans le forum Sybase
    Réponses: 2
    Dernier message: 06/03/2006, 13h12
  2. [PL/SQL] update avec jointure
    Par Fox_magic dans le forum Oracle
    Réponses: 6
    Dernier message: 09/12/2004, 12h19
  3. ADOQuery SQL update
    Par Didier100 dans le forum Bases de données
    Réponses: 4
    Dernier message: 24/06/2004, 11h00
  4. [sql] update pour debutant
    Par zebulix13 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/06/2004, 15h45
  5. [dBase]il y a mieux que la commande sql UPDATE ?
    Par sana72 dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 12/12/2002, 11h59

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