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 03/02/2011, 21h27   #1
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Par défaut catalogue avec plusieurs auteurs

Bonjour a tous

j'ai un soucis de SQL que je n'arrive pas a resoudre, j'espere que
qq'un connait un truc.
Alors voila, il s'agit de la gestion d'un catalogue de livre.
J'ai 3 tables, la TABLE 1 decrit le livre avec le titre etc
La TABLE 2 est une table de relations PK FK
et la TABLE 3 defini les auteurs.

Le but est de creer une nouvelle table ou vue qui rassemble pour chaque livre le ou les auteurs du livre
S'il y avait juste un auteur par livre ça serait beaucoup plus facil car un join suffirait.
Le probleme c'est que pour un livre il peu y avoir plusieurs auteurs.
La segonde complication c'est que l'ordre des auteurs doit etre respecté vu que le premier de la liste
est l'auteur principal, et les autres, les auteurs segondaires.
La table 1 comporte environ 700 livres, donc la table finale devra comporter 700 rows
Dans la nouvelles table l'on aura tous les champs de la table 1 + les auteurs.
Voici un exemple de sortie (on considere que le livre de l'exemple a 2 auteurs):

Code :
1
2
Nouvelle_table
IDLIVRE, titre, localisation, ref, auteur1.nom, auteur1.prenom, auteur2.nom,auteur2.prenom
Code :
1
2
3
4
5
TABLE 1			
IDLIVRE			
titre			
localisation
ref
Code :
1
2
3
TABLE 2	
IDLIVRE	
IDAUTEUR
Code :
1
2
3
4
TABLE 3
IDAUTEUR
NOM
PRENOM
J'accepte tout, SQL ou PL/SQL, ou code python ou autre.
D'avance merci
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 08h37   #2
Membre actif
 
Homme Cyrille
Administrateur de base de données
Inscription : avril 2005
Messages : 112
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 32
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : avril 2005
Messages : 112
Points : 191
Points : 191
Comment fait on pour savoir quel auteur est l'auteur principal? Sans cette information, impossible de les sortirs correctement...
IndianaAngus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 09h25   #3
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Salut

les auteurs apparaissent dans l'ordre, le premier de la table est l'auteur principal, les autres les segondaires. Il n'y a pas d'index sur cette table.
D'avance merci
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 09h33   #4
Membre actif
 
Homme Cyrille
Administrateur de base de données
Inscription : avril 2005
Messages : 112
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 32
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : avril 2005
Messages : 112
Points : 191
Points : 191
Citation:
Envoyé par ldiaz Voir le message
Salut

les auteurs apparaissent dans l'ordre, le premier de la table est l'auteur principal, les autres les segondaires. Il n'y a pas d'index sur cette table.
D'avance merci
voila comment je ferais, une requête et une fonction pl parce que afficher les auteur sur une même ligne sans pl je vois pas trop comment faire.
A toi d'arranger pour que ca fonctionne avec tes paramètres.
J'ai testé et ca marche.

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
 
 
SELECT idlivre, titre, localisation, GETAUTEUR(idlivre) FROM table1;
 
 
CREATE OR REPLACE FUNCTION GETAUTEUR(vidlivre IN NUMBER) RETURN VARCHAR2 AS 
 
  allname varchar2(500);
 
BEGIN
 
 
    FOR auteur_rec IN (SELECT nom, prenom 
                      FROM table3 a
                      INNER JOIN table2 b ON a.idauteur=b.idauteur
                      WHERE b.idlivre =vidlivre  )
    loop
      allname := allname || auteur_rec.nom || ' ' || auteur_rec.prenom || ',';
      dbms_output.put_line(allname);
 
    END LOOP;
 
  allname := substr(allname, 0, length(allname)-1);
  RETURN allname;
END GETAUTEUR;
IndianaAngus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 09h39   #5
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Salut
whaaa rapide, merci de ta reponse, je ne pourrait pas tester avant ce soir.
Donc je donnerait le feed back plus tard.

Encore merci
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 11h56   #6
Rédacteur
 
Inscription : décembre 2002
Messages : 2 385
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 385
Points : 3 261
Points : 3 261
Citation:
Envoyé par ldiaz Voir le message
les auteurs apparaissent dans l'ordre, le premier de la table est l'auteur principal, les autres les segondaires
Attention, c'est une grosse erreur de conception qu'on a souvent l'occasion de rappeler.

Dans une table, il n'y a pas d'ordre implicite, pas même l'ordre d'insertion.
Ca peut donner l'illusion de marcher, mais c'est fondamentalement faux. Lors du SELECT, les données peuvent ressortir dans un ordre qui n'est pas celui de l'insertion.

Donc s'il y a lieu de distinguer auteur principal et auteur secondaire, il faut prévoir une colonne supplémentaire à cet effet.
De même, si vous avez besoin d'un ordre d'affichage particulier, il faut explicitement utiliser ORDER BY.
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/02/2011, 12h41   #7
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Bonjour
ok, ce soir je regarderais dans la table s'il existe un champ qui permette de faire ce distingo...
merci pour ce point, je pensais que un select donnait les rows dans le meme ordre de l'insertion.
Bonne journée
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2011, 12h04   #8
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Bonjour a tous

alors voici le resultat, la requete avec la fonction marche super bien !! MERCI
et pour la deuxieme question, par rapport a l'ordre, et bien il n'y a rien dans la table qui permette de diferencier l'auteur principal et les autres, donc ...

Et bien je vous souhaite a tous un bon week end !
Ciao
ldiaz 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 08h08.


 
 
 
 
Partenaires

Hébergement Web