Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 01/12/2011, 16h02   #1
Membre régulier
 
Avatar de GAEREL
 
Homme Frédéric Gaërel
Inscription : février 2005
Messages : 125
Détails du profil
Informations personnelles :
Nom : Homme Frédéric Gaërel
Âge : 46
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 125
Points : 75
Points : 75
Par défaut Une autre représentation d'arbre

Bonjour à tous.

J'ai une base oracle qui gère des Projets, découpés en Phase puis Activités et Taches. (particularité, les Taches peuvent être à tous les niveaux sauf la racine).

En gros :
Projet
++++ Phase 1
++++++++ Activité 1
++++++++++++ Tache 1
++++++++ Activité 2
++++++++++++ Tache 2
++++ Phase 2
++++++++ Tache 3
++++++++ Activité 3
++++++++++++ Tache 4

malheureusement pour moi ceci est représenté ainsi dans la table :
Code :
1
2
3
4
5
6
7
CREATE TABLE TASK ( 
    ID           NUMBER(10,0) NULL,
    NOM          VARCHAR2(450) NULL,
    NIVEAU       NUMBER(5,0) NULL,
    SEQUENCE     NUMBER(5,0) NULL,
    EST_TACHE    NUMBER(10,0) DEFAULT 0 NOT NULL
    );
soit, pour mon exemple:
Code :
1
2
3
4
5
6
7
8
9
10
ID ID_PROJET NOM        NIVEAU SEQUENCE EST_TACHE
1  1         Phase 1      1         1        0
2  1         Activité 1   2         2        0
3  1         Tache 1      3         3        1
4  1         Activité 2   2         4        0
5  1         Tache 2      3         5        1
6  1         Phase 2      1         6        0
7  1         Tache 3      2         7        1
8  1         Activité 3   2         8        0
9  1         Tache 4      3        9        1
La hiérarchie est donc représentée par les 2 colonnes NIVEAU et SEQUENCE qui représente la profondeur et "l'ordre" des feuilles.

Ma question (on y arrive) est la suivante.
Quelle est la meilleure facon de représenter mes données sous la forme suivante
:
Code :
1
2
3
4
5
6
7
8
9
10
ID_PROJET ID_PHASE ID_ACTIVITE ID_TACHE NOM
1         1        NULL        NULL     Phase 1
1         1        2           NULL     Activité 1
1         1        2           3        Tache 1
1         1        4           NULL     Activité 2
1         1        4           5        Tache 2
1         6        NULL        NULL     Phase 2
1         6        NULL        7        Tache 3
1         6        8           NULL     Activité 3
1         6        8           9       Tache 4
Je suis sous Oracle 10.2
C'est chaud non ?

je l'ai fait mais c'est horrible...
des UNION + des SELECT MAX(ID) KEEP (dense_rank LAST ORDER BY NIVEAU), etc...
GAEREL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 09h06   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Ce que tu cherches à faire est de la cosmétique et n'est pas le boulot du SGBD mais celui du logiciel qui présente les données à l'utilisateur.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 12
Vieux 02/12/2011, 10h46   #3
Membre régulier
 
Avatar de GAEREL
 
Homme Frédéric Gaërel
Inscription : février 2005
Messages : 125
Détails du profil
Informations personnelles :
Nom : Homme Frédéric Gaërel
Âge : 46
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 125
Points : 75
Points : 75
Citation:
Envoyé par CinePhil Voir le message
Ce que tu cherches à faire est de la cosmétique et n'est pas le boulot du SGBD mais celui du logiciel qui présente les données à l'utilisateur.
Certes mais de nombreux reportings vont vouloir cette présentation.
Afin de ne pas devoir refaire cette "conversion de forme" à chaque fois, j'essaie de déporter cela dans une vue qui s'appuierait sur mes tables ce qui sera plus "lisible" pour les développeurs
GAEREL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 10h54   #4
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut,

Cinephile, tu trouves que savoir à quelle activité est rattaché une tâche, a quelle phase est rattachée une activité c'est cosmétique ?

Pas moi.

Par contre, la modélisation est douteuse... je vais essayer de sortir la requête, ça a l'air drôle

[EDIT] Tiens, l'activité 3 ne devrait-elle pas être de niveau 3 et la tâche 4 de niveau 2 ?
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 11h18   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 654
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 654
Points : 2 656
Points : 2 656
Vu la modélisation .....

Moi j'ai fait ca :
ca marche avec l'exemple mais faudrai un truc un peu plus complexe

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
WITH recursive tmp(id_projet, id_phase, id_activite, id_tache , nom, act_seq) AS (
SELECT id_projet, seq, cast(NULL AS integer), cast(NULL AS integer), nom, seq  
FROM task
WHERE seq = 1
union ALL
SELECT a.id_projet, 
case when b.niveau = 1 then b.seq else a.id_phase end,
case when b.niveau = 2 then b.seq else case when b.niveau = 1 then NULL else a.id_activite end end, 
case when b.niveau = 3 then b.seq else NULL end,
b.nom,
b.seq
FROM tmp a
INNER JOIN task b ON a.id_projet = b.id_projet AND a.act_seq + 1 = b.seq)
 
 
SELECT * FROM tmp
Dans mon code "seq" c'est la colonne sequence.
J'ai aussi changé l'id 7 de votre exemple vu que c'est une tache et qu'il a le niveau 2 au lieu de 3 (je suppose, m'enfin si ça n'est pas le cas il faudra juste faire un test sur "est_tache" au lieu de niveau pour régler le problème.)

résultat :
Code :
1
2
3
4
5
6
7
8
9
10
 
1;1;;;"Phase 1";1
1;1;2;;"Activité 1";2
1;1;2;3;"Tache 1";3
1;1;4;;"Activité 2";4
1;1;4;5;"Tache 2";5
1;6;;;"Phase 2";6
1;6;;7;"Tache 3";7
1;6;8;;"Activité 3";8
1;6;8;9;"Tache 4";9

edit :
requete si le jeu de donné de départ est bon
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
WITH recursive tmp(id_projet, id_phase, id_activite, id_tache , nom, act_seq) AS (
SELECT id_projet, seq, cast(NULL AS integer), cast(NULL AS integer), nom, seq  
FROM task
WHERE seq = 1
union ALL
SELECT a.id_projet, 
case when b.niveau = 1 then b.seq else a.id_phase end,
case when (b.niveau = 2 AND b.est_tache = 0) then b.seq else case when b.niveau = 1 then NULL else a.id_activite end end, 
case when b.est_tache = 1 then b.seq else NULL end,
b.nom,
b.seq
FROM tmp a
INNER JOIN task b ON a.id_projet = b.id_projet AND a.act_seq + 1 = b.seq)
 
 
SELECT * FROM tmp
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 11h32   #6
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Punkoff, recursive with, c'est pas avant 11g (R2 ?)



[EDIT]
Je me suis vautré, je vais corriger ma requête
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 11h35   #7
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 654
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 654
Points : 2 656
Points : 2 656
pfff !! c'est le forum SQL !!

Mais tu as raison oui, j'oubli tout le temps ce détail avec les postes Oracle.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 11h42   #8
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Voilà

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
WITH task AS (
SELECT     1     id,     1     id_projet, 'Phase 1' nom,     1     niveau,     1     sequence,     0     est_tache FROM DUAL UNION ALL
SELECT     2     id,     1     id_projet, 'Activité 1' nom,     2     niveau,     2     sequence,     0     est_tache FROM DUAL UNION ALL
SELECT     3     id,     1     id_projet, 'Tache 1' nom,     3     niveau,     3     sequence,     1     est_tache FROM DUAL UNION ALL
SELECT     4     id,     1     id_projet, 'Activité 2' nom,     2     niveau,     4     sequence,     0     est_tache FROM DUAL UNION ALL
SELECT     5     id,     1     id_projet, 'Tache 2' nom,     3     niveau,     5     sequence,     1     est_tache FROM DUAL UNION ALL
SELECT     6     id,     1     id_projet, 'Phase 2' nom,     1     niveau,     6     sequence,     0     est_tache FROM DUAL UNION ALL
SELECT     7     id,     1     id_projet, 'Tache 3' nom,     2     niveau,     7     sequence,     1     est_tache FROM DUAL UNION ALL
SELECT     8     id,     1     id_projet, 'Activité 3' nom,     2     niveau,     8     sequence,     0     est_tache FROM DUAL UNION ALL
SELECT     9     id,     1     id_projet, 'Tache 4' nom, 	3	 niveau, 	9	 sequence, 	1	 est_tache FROM DUAL)
, u AS (
SELECT a.*, max(case niveau when 1 then sequence else 0 end) over(partition BY id_projet ORDER BY sequence) phase 
FROM task a)
SELECT u.*, case when niveau = 2 AND est_tache = 1 then NULL else nullif(max(case niveau when 2 then sequence else 0 end) over(partition BY id_projet, phase ORDER BY sequence), 0) end activite
,case est_tache when 1 then sequence end tache
FROM u
Se baser sur la séquence et le niveau, et faire du fenêtrage...

[EDIT] Zut, j'avais pas vu qu'une tâche n'était pas forcément rattachée à une activité...
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 13h05   #9
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 654
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 654
Points : 2 656
Points : 2 656
Citation:
Envoyé par pacmann Voir le message
[EDIT] Zut, j'avais pas vu qu'une tâche n'était pas forcément rattachée à une activité...

Avec un autre partition by id_project, tache, activité pour déterminer la tâche ca devrait le faire


edit: ah oui, c'est mieux !
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 13h07   #10
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Bah en fait, j'avais bidouillé en ajoutant un CASE
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 15h25   #11
Membre régulier
 
Avatar de GAEREL
 
Homme Frédéric Gaërel
Inscription : février 2005
Messages : 125
Détails du profil
Informations personnelles :
Nom : Homme Frédéric Gaërel
Âge : 46
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 125
Points : 75
Points : 75
Impressionnant, je ne m'attendais pas à une telle rapidité dans les réponses...

Je soupçonne cependant un pb.
Je teste et je vous en reparle

Euh.. Merci quand même
GAEREL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 15h47   #12
Membre régulier
 
Avatar de GAEREL
 
Homme Frédéric Gaërel
Inscription : février 2005
Messages : 125
Détails du profil
Informations personnelles :
Nom : Homme Frédéric Gaërel
Âge : 46
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 125
Points : 75
Points : 75
Voici mon jeu de test sous une forme plus... visuelle :



Voici la table correspondante pour les tests :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
WITH TACHE AS (
SELECT 445 AS ID, 121 AS ID_PROJET, 'Activites transverses' AS NOM, 1 AS NIVEAU, 1 AS SEQ, 0 AS EST_TACHE FROM DUAL UNION ALL
SELECT 447 AS ID, 121 AS ID_PROJET, 'Coordination et Management' AS NOM, 2 AS NIVEAU, 2 AS SEQ, 0 AS EST_TACHE FROM DUAL UNION ALL
SELECT 448 AS ID, 121 AS ID_PROJET, 'Suivi Projet' AS NOM, 3 AS NIVEAU, 3 AS SEQ, 1 AS EST_TACHE FROM DUAL UNION ALL
SELECT 555 AS ID, 121 AS ID_PROJET, 'Conception' AS NOM, 1 AS NIVEAU, 4 AS SEQ, 0 AS EST_TACHE FROM DUAL UNION ALL
SELECT 589 AS ID, 121 AS ID_PROJET, 'Réunions Expression Besoins' AS NOM, 2 AS NIVEAU, 5 AS SEQ, 1 AS EST_TACHE FROM DUAL UNION ALL
SELECT 557 AS ID, 121 AS ID_PROJET, 'Spécifications fonctionnelles' AS NOM, 2 AS NIVEAU, 6 AS SEQ, 0 AS EST_TACHE FROM DUAL UNION ALL
SELECT 558 AS ID, 121 AS ID_PROJET, 'Rédaction des Spécifications' AS NOM, 3 AS NIVEAU, 7 AS SEQ, 1 AS EST_TACHE FROM DUAL UNION ALL
SELECT 560 AS ID, 121 AS ID_PROJET, 'Réalisation et Qualification' AS NOM, 1 AS NIVEAU, 8 AS SEQ, 0 AS EST_TACHE FROM DUAL UNION ALL
SELECT 562 AS ID, 121 AS ID_PROJET, 'Réalisation et tests unitaires' AS NOM, 2 AS NIVEAU, 9 AS SEQ, 0 AS EST_TACHE FROM DUAL UNION ALL
SELECT 552 AS ID, 121 AS ID_PROJET, 'Réalisation Prog 1' AS NOM, 3 AS NIVEAU, 10 AS SEQ, 1 AS EST_TACHE FROM DUAL UNION ALL
SELECT 563 AS ID, 121 AS ID_PROJET, 'Réalisation Prog 2' AS NOM, 3 AS NIVEAU, 11 AS SEQ, 1 AS EST_TACHE FROM DUAL UNION ALL
SELECT 564 AS ID, 121 AS ID_PROJET, 'Intégration et qualification interne' AS NOM, 2 AS NIVEAU, 12 AS SEQ, 0 AS EST_TACHE FROM DUAL UNION ALL
SELECT 551 AS ID, 121 AS ID_PROJET, 'Intégration' AS NOM, 3 AS NIVEAU, 13 AS SEQ, 1 AS EST_TACHE FROM DUAL UNION ALL
SELECT 565 AS ID, 121 AS ID_PROJET, 'Qualification' AS NOM, 3 AS NIVEAU, 14 AS SEQ, 1 AS EST_TACHE FROM DUAL UNION ALL
SELECT 614 AS ID, 121 AS ID_PROJET, 'Recette' AS NOM, 1 AS NIVEAU, 15 AS SEQ, 0 AS EST_TACHE FROM DUAL UNION ALL
SELECT 613 AS ID, 121 AS ID_PROJET, 'Recette par le client' AS NOM, 2 AS NIVEAU, 16 AS SEQ, 1 AS EST_TACHE FROM DUAL UNION ALL
SELECT 572 AS ID, 121 AS ID_PROJET, 'Déploiement et Généralisation' AS NOM, 1 AS NIVEAU, 17 AS SEQ, 0 AS EST_TACHE FROM DUAL UNION ALL
SELECT 576 AS ID, 121 AS ID_PROJET, 'Mise en production' AS NOM, 2 AS NIVEAU, 18 AS SEQ, 1 AS EST_TACHE FROM DUAL)
Petite particularité qui ruine un peu votre solution :
Vous êtes partis du principe que les ID étaient croissants, ce n'est pas le cas (mon jeu de tests était trop simple en effet, désolé).
L'ID est une PK créée par le système, dans ce nouveau jeu de données j'ai créé la Phase "Recette" après les autres taches.
Les ID ne sont alors plus croissants.

Voici les données de la table TACHE :


Votre solution me donne alors :

Les deux dernières lignes sont fausses, la Phase correspondant est la 572, pas la 614,
la 572 est une Phase, elle ne peut pas avoir d'id_activite.
GAEREL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 15h57   #13
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Ben pourquoi tu as pris l'ID ?

(C'est bien ton SEQ qui correspond à "sequence" dans ma requête ?)
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 16h17   #14
Membre régulier
 
Avatar de GAEREL
 
Homme Frédéric Gaërel
Inscription : février 2005
Messages : 125
Détails du profil
Informations personnelles :
Nom : Homme Frédéric Gaërel
Âge : 46
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 125
Points : 75
Points : 75
Citation:
Envoyé par pacmann Voir le message
Ben pourquoi tu as pris l'ID ?

(C'est bien ton SEQ qui correspond à "sequence" dans ma requête ?)
Pour faire des jointures...

si je veux le libelle de l’activité ou de la phase correspondant à une tache donnée...
GAEREL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 16h33   #15
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Nan, ce que je veux dire, c'est que ton ID n'est certes pas croissant, mais ta séquence l'est, non ?
Donc pour construire la phase et le reste, il faut se baser sur la séquence et non sur l'ID !
(On est bien d'accord que ta séquence est unique sur le projet ?)
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 16h36   #16
Membre régulier
 
Avatar de GAEREL
 
Homme Frédéric Gaërel
Inscription : février 2005
Messages : 125
Détails du profil
Informations personnelles :
Nom : Homme Frédéric Gaërel
Âge : 46
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 125
Points : 75
Points : 75
Citation:
Envoyé par pacmann Voir le message
Nan, ce que je veux dire, c'est que ton ID n'est certes pas croissant, mais ta séquence l'est, non ?
Donc pour construire la phase et le reste, il faut se baser sur la séquence et non sur l'ID !
(On est bien d'accord que ta séquence est unique sur le projet ?)
Oui la séquence est unique. (et croissante, pour donner l'ordre)

euh je suis un peu paumé alors...

quel est l'ordre SQL ?
GAEREL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 16h37   #17
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Ben tu prends ma requête d'avant, et tu remplaces "sequence" par "seq" ?
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 16h40   #18
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
J'ai une question : que se passe-t-il si vous devez insérer une nouvelle feuille dans votre arbre ? Vous décalez toutes les valeur de "sequence" a posteriori ? Ça semble franchement horrible.

Il ne serait pas envisageable d'avoir une table qui ressemble à une table d'arbre en rajoutant une colonne id_pere ? Parce que à terme, je ne vois que des problèmes à ce genre de tables.
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 16h47   #19
Membre régulier
 
Avatar de GAEREL
 
Homme Frédéric Gaërel
Inscription : février 2005
Messages : 125
Détails du profil
Informations personnelles :
Nom : Homme Frédéric Gaërel
Âge : 46
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 125
Points : 75
Points : 75
Citation:
Envoyé par Rei Ichido Voir le message
J'ai une question : que se passe-t-il si vous devez insérer une nouvelle feuille dans votre arbre ? Vous décalez toutes les valeur de "sequence" a posteriori ? Ça semble franchement horrible.

Il ne serait pas envisageable d'avoir une table qui ressemble à une table d'arbre en rajoutant une colonne id_pere ? Parce que à terme, je ne vois que des problèmes à ce genre de tables.
je confirme que ce n'est pas simple...
Mais il s'agit d'un progiciel, je n'ai pas la main sur le schéma...
D'où mon choix d'ajouter des vues qui "tapent" sur ce schéma pour en simplifier l'utilisation.

En réponse au dernier post de Pacmann :
l'ordre est donc :
Code :
1
2
3
4
5
6
7
 copier/coller la définition de TACHE, 
TMP AS (
    SELECT a.*, max(case niveau when 1 then seq else 0 end) over(partition BY id_projet ORDER BY seq) phase 
FROM TACHE A)
SELECT TMP.*, case when niveau = 2 AND est_tache = 1 then NULL else nullif(max(case niveau when 2 then seq else 0 end) over(partition BY id_projet, phase ORDER BY seq), 0) end activite
,case est_tache when 1 then seq end tache
FROM TMP
Résultat ok mais je ne peux pas faire de jointures directes avec les PK de la table pour, par exemple, trouver le libelle/nom de la phase correspondant à une tache donnée.

Pas trop grave, je ferai une double jointure sur id_projet ET sequence.
Mais il me faudrait un index... (sur une vue???, je rappelle que le but ultime est de mettre ca dans une vue)
GAEREL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 17h15   #20
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Alors tu peux faire un truc complètement barbare si tu connais la valeur max d'ID (celle qu'elle ne dépassera jamais).
Genre si ça dépasse pas 999, tu fais
seq * 1000 + ID à la place de seq : ça garde le même classement au niveau des order by, max et tout.
Et à la fin, ton ID est le reste de la division par 1000 de ton machin bricolé
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h53.


 
 
 
 
Partenaires

Hébergement Web