Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1476 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Oracle] Jointures

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Oracle] Jointures

n°1762903
krovomi
Posté le 22-07-2008 à 10:04:29  profilanswer
 

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
mood
Publicité
Posté le 22-07-2008 à 10:04:29  profilanswer
 

n°1762937
olivthill
Posté le 22-07-2008 à 10:56:54  profilanswer
 

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).

n°1762949
krovomi
Posté le 22-07-2008 à 11:07:01  profilanswer
 

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

n°1762961
MagicBuzz
Posté le 22-07-2008 à 11:23:13  profilanswer
 

é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

n°1762985
krovomi
Posté le 22-07-2008 à 11:54:56  profilanswer
 

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
n°1763225
MagicBuzz
Posté le 22-07-2008 à 15:27:18  profilanswer
 

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.

n°1763255
krovomi
Posté le 22-07-2008 à 16:03:25  profilanswer
 

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

n°1763303
MagicBuzz
Posté le 22-07-2008 à 16:59:56  profilanswer
 

"en vie" ?

n°1763308
krovomi
Posté le 22-07-2008 à 17:05:50  profilanswer
 

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
n°1763360
MagicBuzz
Posté le 22-07-2008 à 19:42:37  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Oracle] Jointures

 

Sujets relatifs
rassembler tables crées sous oracleC++ et Oracle sans ODBC ni JDBC
[ORACLE] Problème de création de clé étrangère[RESOLU][ORACLE] Sequence - Probleme avec les nombres générés
JDBC + BLOB/CLOB + Oracle[ORACLE] problème requête (pour les chauds du SQL)
[ORACLE - TEMPORARY - ORA 1555] Snapshot trop vieux sur une temporary[ORACLE - TRIGGER]exception TABLE IS MUTATING
Oracle et les indexoracle : sélection de données entre deux dates.
Plus de sujets relatifs à : [Oracle] Jointures


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR