Précédent   Forum des professionnels en informatique > Bases de données > Sybase
Sybase Forum sur la base de données Sybase. Avant de poster -> F.A.Q Sybase, Tutoriels Sybase
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/03/2006, 18h09   #1
Candidat au titre de Membre du Club
 
Inscription : août 2003
Messages : 43
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 43
Points : 13
Points : 13
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
metheorn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2006, 08h09   #2
Rédacteur/Modérateur
 
Avatar de fadace
 
Homme Fabien Celaia
Administrateur de base de données
Inscription : octobre 2002
Messages : 3 779
Détails du profil
Informations personnelles :
Nom : Homme Fabien Celaia
Âge : 41
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2002
Messages : 3 779
Points : 8 124
Points : 8 124
Envoyer un message via ICQ à fadace Envoyer un message via Skype™ à fadace
je ne comprends pas comment vous obtenez les 2 dernières lignes !
__________________
Sr DBA Oracle / Sybase / MS-SQL / DB2 / Informix / Postgresql
Administrateur SAP
Mes articles

Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !
fadace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2006, 19h23   #3
Candidat au titre de Membre du Club
 
Inscription : août 2003
Messages : 43
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 43
Points : 13
Points : 13
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
metheorn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2006, 13h47   #4
Candidat au titre de Membre du Club
 
Inscription : août 2003
Messages : 43
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 43
Points : 13
Points : 13
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 ?
metheorn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2006, 16h36   #5
Candidat au titre de Membre du Club
 
Inscription : août 2003
Messages : 43
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 43
Points : 13
Points : 13
C'est bon, j'ai trouvé :

Code :
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
metheorn est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h37.


 
 
 
 
Partenaires

Hébergement Web