Pourriez-vous m'aider concernant l'élaboration d'une requête SQL sur une base de données ?
Le contexte est le suivant: mon système gère des contrats liés à des activités (1 contrat peut être lié à 1 ou plusieurs activités). Chaque activité est lié à un "domaine"
Voici la structure des tables de ma base de données:
Table CONTRAT
Id_CONTRAT Titre_CONTRAT 1 Contrat 1 2 Contrat 2 3 Contrat 3 4 Contrat 4
Table DOMAINE
Id_DOMAINE Titre_DOMAINE 2 Domaine 2 3 Domaine 3 5 Domaine 5 8 Domaine 8
Table ACTIVITE
Id_ACTIVITE Titre_ACTIVITE Id_DOMAINE 118 Activite 118 2 266 Activite 266 2 269 Activite 269 3 272 Activite 272 3 275 Activite 275 5 283 Activite 283 8 301 Activite 301 8
Table de liaison LIEN_CONTRAT_ACTIVITE
Id_CONTRAT Id_ACTIVITE 1 118 2 266 2 269 3 272 4 275 4 283 4 301
J'ai créé cette vue: VUE_CONTRAT_ACTIVITE_DOMAINE en effectuant la requête:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT c.Id_CONTRAT, a.Id_ACTIVITE, a.Id_DOMAINE FROM LIEN_CONTRAT_ACTIVITE c, activite a WHERE c.Id_CONTRAT = a.Id_CONTRAT
Id_CONTRAT Id_ACTIVITE Id_DOMAINE 1 118 2 2 266 2 2 269 3 3 272 3 4 275 5 4 283 8 4 301 8
J'ai effectué cette requête afin d'obtenir tous les domaines obtenus par contrat:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SELECT Id_CONTRAT, SUBSTR(SYS_CONNECT_BY_PATH(Id_DOMAINE,';'),2) Id_DOMAINE FROM (SELECT Id_DOMAINE, Id_CONTRAT, COUNT(*) OVER ( partition BY Id_CONTRAT ) im, ROW_NUMBER () OVER ( partition BY Id_CONTRAT order by Id_DOMAINE) seq FROM VUE_CONTRAT_ACTIVITE_DOMAINE WHERE Id_CONTRAT IS NOT NULL ) WHERE seq =im START WITH seq =1 CONNECT BY prior seq+1=seq AND prior Id_CONTRAT =Id_CONTRAT
Titre_CONTRAT Id_DOMAINE Contrat 1 2 Contrat 2 2;3 Contrat 3 3 Contrat 4 2;8;8
Cependant je souhaiterais pour la dernière ligne que le système affiche 2;8 et non pas 2;8;8 c'est-à-dire qu'il n'affiche q'une fois le domaine même si celui-ci est le même pour plusieurs activités.
Pourriez-vous me dire comment faire?
Merci d'avance pour votre aide.
Cordialement
Partager