[SQL - ORACLE] Requete un peu complexe (pour moi)

Requete un peu complexe (pour moi) [SQL - ORACLE] - SQL/NoSQL - Programmation

Marsh Posté le 28-10-2005 à 09:25:03    

Bonjour,
 
Je dois écrire une requete qui relie 4 tables et j'ai un petit soucis.
Pour vous expliquer, je ne vais prendre que 2 tables en espérant pouvoir l'adapter plus tard à mon système des 4 tables.
 
Les 2 tables sont donc :
CARACT_TITRE et CARACT_VALEUR
 
La clé primaire de ces deux tables est composée de : ID_equipement et Ordre_affichage.
Je dois pouvoir récupérer, dans une meme ligne, le titre et la valeur.
Jusque là, pas de problèmes.
 
Il n'y a pas d'enregistrement pour la valeur si elle est nulle mais je dois quand meme pouvoir récupérer la valeur. J'ai pu obtenir le bon résultat en utilisant une jointure externe.
Mon problème est que ce fonctionnement est également vrai dans l'autre sens. C'est à dire qu'il peut y avoir une valeur sans titre associé s'il n'est pas défini.
 
Et là, je ne sais plus faire.
Je ne sais pas comment faire pour afficher, dans l'ordre Ordre_affichage, tous les titres qu'ils aient une valeur ou non et toutes les valeurs qu'ils aient un titre ou non.
 
J'ai pas mal cherché de mon coté mais pas pu utilisé google car je ne vois meme pas quels mots clé je pourrais donner.
 
Quelqu'un a t'il déjà été confronté a ce problème et / ou quelqu'un a t'il une piste pour m'aider un petit peu ?
 
Merci beaucoup
Worldofdada

Reply

Marsh Posté le 28-10-2005 à 09:25:03   

Reply

Marsh Posté le 28-10-2005 à 09:42:17    

bah si, c'est une jointure externe complete, et pas seulement gauche ou droite, que tu veux, non? (full outer join)


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 28-10-2005 à 09:44:21    

Ben c'est ce que je me suis dit également mais je n'ai pas réussi avec mes 4 tables.
 
Et c'est pour au final etre mis dans du Crystal Report ...
 
Je vais re-tenter cette solution   ;o)

Reply

Marsh Posté le 28-10-2005 à 14:52:25    

C'est possible de faire un full outer join sur plusieurs tables ?
 
Je m'explique avec le schéma ci dessous :
http://img369.imageshack.us/my.php?image=tmp6gn.jpg
 
Je n'ai malhreusement pas la possibilité de modifier le schéma de données.
Seul le lien du bas n'existe pas. Je l'ai mis car je dois m'en servir pour ma requete pour éviter d'avoir le produit cartésien des enregistrements : le titre 1 doit aller avec la valeur 1 et pas avec toutes les valeurs.
 
Mon soucis est que si je fais un full outer join entre EQP_ATTRIBUTS et ATTRIBUTS, le résultat est le meme.
Et je ne sais pas comment faire pour réaliser les outer joins sur plusieurs tables.
 
Quelqu'un a une petite idée ?
 
Merci beaucoup.


Message édité par Worldofdada le 28-10-2005 à 14:53:37
Reply

Marsh Posté le 28-10-2005 à 15:00:07    

Pour ceux qui veulent plus de détails :
 
http://img462.imageshack.us/my.php?image=tmp28kk.jpg
 
Je tente des trucs mais soit j'ai 75 000 résultats, soit 30 alors que je devrais en avoir une cinquantaire   :(


Message édité par Worldofdada le 28-10-2005 à 15:00:42
Reply

Marsh Posté le 28-10-2005 à 15:28:08    

En réfléchissant un peu plus, je ne crois pas que je soit obligé de faire des outer join sur plusieurs tables étant donné que c'est juste le lien Ordre d'affichage qui pose problème.
 
Personne ne pourrait m'aider SVP ??

Reply

Marsh Posté le 28-10-2005 à 16:05:22    

Citation :

Il n'y a pas d'enregistrement pour la valeur si elle est nulle mais je dois quand meme pouvoir récupérer la valeur. J'ai pu obtenir le bon résultat en utilisant une jointure externe.  
Mon problème est que ce fonctionnement est également vrai dans l'autre sens. C'est à dire qu'il peut y avoir une valeur sans titre associé s'il n'est pas défini.

Dans ce cas, il faut utiliser deux jointures externes, une pour chaque sens, et additionner les résultats avec une Union.
Pour un exemple, voir ma réponse à une question similaire à http://www.codeguru.com/forum/showthread.php?t=358783 .

Reply

Marsh Posté le 28-10-2005 à 16:29:56    

Mon soucis est qu'au final je dois l'utiliser dans Crystal Report.
 
Je viens d'essayer sous Toad et ca ne marche quand meme pas ... pourtant, j'ai bien repris l'exemple donné (avec des where en plus)

Reply

Marsh Posté le 28-10-2005 à 16:33:44    

En fait, si je ne met pas de left/right/full join, ca me renvoi le produit cartésien des résultats.
 
Si je met left/right/full join avec le ON sur mon champ INDX (ordre d'affichage), ca me renvoi toujours la meme liste : la meme que si je met INDX = INDX en clause Where ...
 
snif

Reply

Marsh Posté le 28-10-2005 à 17:34:30    

Fournis-nous un script qui crée les tables et données (tu peux le faire sous Toad), pas nécessairement toutes les données, juste assez pour l'exemple.
 
Si tu fais ce petit exemple, tu devrais voir ce que ça donne (très basique ;) ) :
 

Code :
  1. DROP TABLE tableA;
  2. DROP TABLE tableB;
  3. DROP TABLE tableC;
  4. CREATE TABLE tableA
  5. (ID NUMBER(9),
  6. VALUE VARCHAR2(10));
  7. INSERT INTO tableA
  8. VALUES (1, 'A');
  9. INSERT INTO tableA
  10. VALUES (3, 'B');
  11. INSERT INTO tableA
  12. VALUES (4, 'C');
  13. INSERT INTO tableA
  14. VALUES (6, 'D');
  15. INSERT INTO tableA
  16. VALUES (7, 'E');
  17. INSERT INTO tableA
  18. VALUES (9, 'F');
  19. CREATE TABLE tableB
  20. (ID NUMBER(9),
  21. VALUE VARCHAR2(10));
  22. INSERT INTO tableB
  23. VALUES (1, 'G');
  24. INSERT INTO tableB
  25. VALUES (2, 'H');
  26. INSERT INTO tableB
  27. VALUES (3, 'I');
  28. INSERT INTO tableB
  29. VALUES (6, 'J');
  30. CREATE TABLE tableC
  31. (ID NUMBER(9),
  32. VALUE VARCHAR2(10));
  33. INSERT INTO tableC
  34. VALUES (1, 'J');
  35. INSERT INTO tableC
  36. VALUES (2, 'K');
  37. INSERT INTO tableC
  38. VALUES (8, 'L');
  39. SELECT * FROM tableA;
  40. SELECT * FROM tableB;
  41. SELECT * FROM tableC;
  42. SELECT *
  43. FROM tableA
  44. FULL OUTER JOIN tableB ON tableB.ID = tableA.ID
  45. FULL OUTER JOIN tableC ON tableC.ID = tableA.ID;


 
edit : ton problème est juste sur l'ordre d'affichage des résultats ? Dans ce cas, donne les règles d'affichage.


Message édité par Beegee le 28-10-2005 à 17:35:38
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed