[Oracle] Jointures

Jointures [Oracle] - SQL/NoSQL - Programmation

Marsh Posté le 22-07-2008 à 10:04:29    

Bonjour,
 
J'avais posté la semaine dernière un post concernant une requête avec des jointures, celle-ci semble marcher au niveau de la syntaxe, mais pas au niveau du nombre de résultats sortis. voici ma requête :
 

Code :
  1. SELECT tmp4.name_prefix,
  2.            tmp4.cfa,
  3.            ...
  4.            tmp2.credit_card_number,
  5.            ...
  6.            tmp3.secretaire,
  7.            ...
  8.            tmp1.BUS_TRAVELER_ROLLUP_TYPE_DESC,
  9.            ...
  10.        FROM tmp_export_profils_portrait4 tmp4
  11.         INNER JOIN tmp_export_profils_portrait3 tmp3 ON (tmp4.pin_number=tmp3.pin_number)
  12.         INNER JOIN tmp_export_profils_portrait2 tmp2 ON (tmp3.pin_number=tmp2.pin_number)
  13.         INNER JOIN tmp_export_profils_portrait tmp1 ON (tmp2.pin_number=tmp1.pin_number)


 
Dans ma table tmp_export_profils_portrait4 j'ai 22757 enregistrements,
Dans ma table tmp_export_profils_portrait3 j'ai 22691 enregistrements,
Dans ma table tmp_export_profils_portrait2 j'ai 22719 enregistrements,
Dans ma table tmp_export_profils_portrait j'ai 12109 enregistrements
 
et lorsque j'execute la requête dessus je n'ai que 15671 enregistrements qui sortent.
 
D'où ma question : Pourquoi je n'ai pas 22757 enregistrements ? (à savoir le nombre maximum d'enregistrements dans la table où il y a le plus d'enregistrements ?) C'est ce que j'aimerai faire justement, quitte à mettre des champs vides quand il n'y a pas de valeurs.
 
Merci
 
Elmoricq-edit : pas de titres tout en majuscules


Message édité par Elmoricq le 22-07-2008 à 10:16:53
Reply

Marsh Posté le 22-07-2008 à 10:04:29   

Reply

Marsh Posté le 22-07-2008 à 10:56:54    

Dans ce cas, il faudrait remplacer INNER JOIN par LEFT JOIN.
Voir http://forum.hardware.fr/hfr/Progr [...] 7208_1.htm
 
Par ailleurs, bien que INNER JOIN et LEFT JOIN soit standard, en pratique, on utilise assez peu cette syntaxe lourde et peu lisible. A la place, sous Oracle, on utilise
 

SELECT tmp4.name_prefix,
       tmp4.cfa,
       ...
       tmp2.credit_card_number,
       ...
       tmp3.secretaire,
       ...
       tmp1.BUS_TRAVELER_ROLLUP_TYPE_DESC,
       ...
  FROM tmp_export_profils_portrait4 tmp4,
       tmp_export_profils_portrait3 tmp3,
       tmp_export_profils_portrait2 tmp2,  
       tmp_export_profils_portrait1 tmp1
 WHERE tmp4.pin_number = tmp3.pin_number
   AND tmp3.pin_number = tmp2.pin_number
   AND tmp2.pin_number = tmp1.pin_number;


ou pour remplacer les left join,

SELECT tmp4.name_prefix,
       tmp4.cfa,
       ...
       tmp2.credit_card_number,
       ...
       tmp3.secretaire,
       ...
       tmp1.BUS_TRAVELER_ROLLUP_TYPE_DESC,
       ...
  FROM tmp_export_profils_portrait4 tmp4,
       tmp_export_profils_portrait3 tmp3,
       tmp_export_profils_portrait2 tmp2,  
       tmp_export_profils_portrait1 tmp1
 WHERE tmp4.pin_number (+) = tmp3.pin_number
   AND tmp3.pin_number (+) = tmp2.pin_number
   AND tmp2.pin_number (+) = tmp1.pin_number;

(ou le (+) de l'autre côté, je ne me souviens jamais).

Reply

Marsh Posté le 22-07-2008 à 11:07:01    

Mais justement on m'avait dit que c'était une ancienne façon de faire des jointures (norme de 1986 ou un truc comme ça).
 
Le problème c'est qu'en faisant des left join il va répéter les données d'une table dans une autre, chose que je ne veux pas.
 
J'ai pensé aux FULL OUTER JOIN, qu'en pensez-vous ?
 
Merci d'avance

Reply

Marsh Posté le 22-07-2008 à 11:23:13    

écoute pas olivtill, c'est mieux les jointures explicites ;) (et c'est un ancien anti-JOIN qui parle)
 
pour le full outer join, cela ne sert qu'à ramener des lignes dans tous les cas : que les données soit présentes des deux côté, que à droite ou que à gauche. c'est assez rare qu'on l'utilise (la preuve, très peu de sgbd le supportent)
 
par contre, explique ce que tu veux réellement (avec 3 lignes dans chacune de tes tables, montre ce que tu veux comme résultat) parceque là c'est pas clair

Reply

Marsh Posté le 22-07-2008 à 11:54:56    

MagicBuzz a écrit :

écoute pas olivtill, c'est mieux les jointures explicites ;) (et c'est un ancien anti-JOIN qui parle)
 
pour le full outer join, cela ne sert qu'à ramener des lignes dans tous les cas : que les données soit présentes des deux côté, que à droite ou que à gauche. c'est assez rare qu'on l'utilise (la preuve, très peu de sgbd le supportent)
 
par contre, explique ce que tu veux réellement (avec 3 lignes dans chacune de tes tables, montre ce que tu veux comme résultat) parceque là c'est pas clair


 
J'ai 4 tables tmp1, tmp2, tmp3 et tmp4. Il n'y a pas de relations entre elles au niveau MCD, juste que pour les données il y a un champs "pin_number" qui se retrouve dans les 4 tables (mais celles-ci n'ont pas le même nombre d'enregistrement".
 
Merci


Message édité par krovomi le 05-08-2008 à 16:10:44
Reply

Marsh Posté le 22-07-2008 à 15:27:18    

c'est donc full outer join sur chacune des tables.
 
plus exactement, un full sur le résultat de la précédente jointure à chaque fois, en utilisant un alias.

Reply

Marsh Posté le 22-07-2008 à 16:03:25    

merci,
 
est-ce que si je fais une clé étrangère sur plusieurs champs (4 champs en l'occurence), et que l'un d'eux est vie, est-ce que cela pose problème ?
 
Merci

Reply

Marsh Posté le 22-07-2008 à 16:59:56    

"en vie" ?

Reply

Marsh Posté le 22-07-2008 à 17:05:50    

pardon je voulais dire une clé primaire...au temps pour moi !!!
 
On ne peut pas mettre un des champs de la clé primaire sur plusieurs champs à null ?
 
Merci


Message édité par krovomi le 22-07-2008 à 17:06:40
Reply

Marsh Posté le 22-07-2008 à 19:42:37    

une clé étrangère pointe forcément sur une clé primaire dans la table de référence.
et toutes les données doivent être présentes dans la table de référence.
 
dans ton cas, vu que c'est peut-être bien que oui peut-être bien que nom dans chaque table, c'est pas possible de faire des clés étrangères

Reply

Sujets relatifs:

Leave a Replay

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