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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Aide sur jointure externe complête

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Aide sur jointure externe complête

n°1953391
MaRTy59
Posté le 28-12-2009 à 12:00:12  profilanswer
 

Bonjour à tous, j'aimerais faire une requête qui me permet de rapprocher des personnes, je travail sur deux bases de données différentes, je me connecte sur une et à partir d'un link je peux me connecter sur l'autre.
 

Code :
  1. SELECT  Translate(Upper(base1.NOM), 'àãâäçéèêëîïôöûüù _-^¨"''', 'aaaaceeeeiioouuu'), Translate(Upper(base1.PRENOM),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu'), Translate(Upper(base2.NAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu'), Translate(Upper(base2.FIRSTNAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')
  2. FROM    AGENT base1, p_ctc@linkbase1base2 base2
  3. WHERE   Translate(Upper(base1.NOM), 'àãâäçéèêëîïôöûüù _-^¨"''', 'aaaaceeeeiioouuu') = Translate(Upper(base2.FIRSNAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')
  4. AND     Translate(Upper(base1.PRENOM),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu') = Translate(Upper(base2.FIRSTNAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu');


En gros, il y a des personnes qui existent dans les deux bases, des personnes n'existant que dans la première et des personnes qui n'existent que dans la deuxième. Les translate servent à enlever tous les caractères spéciaux, blancs etc ... Pour que par exemple un Dupond Jean Pierre dans la première base et un Dupond Jean-Pierre dans la deuxième soient egaux car c'est la même personne, ce qui donnera DUPOND JEANPIERRE pour relever l'égalité. J'aimerais les rapprocher de cette façon :
 

Code :
  1. BASE1            BASE2
  2. NOM PRENOM       NAME FIRSTNAME


 
Avec ce que j'ai fait ça marche, maintenant je vais vous faire une batterie de tests pour voir ce que j'aimerais, car actuellement je n'ai pas tous les agents des deux cotés :

Code :
  1. BASE1                        BASE2
  2. DUPOND JEANPIERRE            DUPOND JEANPIERRE
  3. DUPONT MARC                   
  4.                              CLAVIER CHRISTIAN

                     
Si il y a une case blanche, le nom n'est pas présent dans la base.
 
En cherchant, j'ai essayé de le faire mais j'ai une erreur ...
"la commande sql ne se termine pas correctement"

Code :
  1. SELECT  base1.NOM, base1.PRENOM, base1.DEPART, Translate(Upper(base1.NOM), 'àãâäçéèêëîïôöûüù _-^¨"''', 'aaaaceeeeiioouuu'), Translate(Upper(base1.PRENOM),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu'), base2.NAME, base2.FIRSTNAME, base2.VALIDPNT, Translate(Upper(base2.NAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu'), Translate(Upper(base2.FIRSTNAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')
  2. FROM    AGENT base1 FULL OUTER JOIN p_ctc@linkbase1base2 base2
  3. ON      Translate(Upper(base1.NOM), 'àãâäçéèêëîïôöûüù _-^¨"''', 'aaaaceeeeiioouuu') = Translate(Upper(base2.FIRSNAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')
  4. AND     Translate(Upper(base1.PRENOM),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu') = Translate(Upper(base2.FIRSTNAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu');


J'espère que c'est compréhensible merci de votre aide.

mood
Publicité
Posté le 28-12-2009 à 12:00:12  profilanswer
 

n°1953403
casimimir
Posté le 28-12-2009 à 14:30:40  profilanswer
 

tu exécutes cela dans quoi? parceque la requête a l'air correcte, mais certains outils n'acceptent pas le ; final lors d'une exécution.
En fait elle s'exécute ou pas?

 

par contre tu devrais faire un lower plutot qu'un upper sinon le translate ne matchera jamais tes caractères accentués.


Message édité par casimimir le 28-12-2009 à 14:31:50
n°1953431
MaRTy59
Posté le 28-12-2009 à 15:59:31  profilanswer
 

J'essaye ça dans SQL Tools 1.5, j'ai essayé avec et sans et j'ai toujours une erreur du type "la commande sql ne se termine pas correctement".
Ce que je veux faire s'appelle une jointure externe complète mais je pense que la base est trop vieille donc impossible de faire comme ça ...
Le seul moyen est d'utiliser des (+) pour faire des jointures externes droites ou gauches donc ça ressemble à ça :

Code :
  1. SELECT  base1.NOM, base1.PRENOM, base1.DEPART, Translate(Upper(base1.NOM), 'àãâäçéèêëîïôöûüù _-^¨"''', 'aaaaceeeeiioouuu'), Translate(Upper(base1.PRENOM),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu'), base2.NAME, base2.FIRSTNAME, base2.VALIDPNT, Translate(Upper(base2.NAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu'), Translate(Upper(base2.FIRSTNAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')
  2. FROM    AGENT base1, p_ctc@linkbase1base2 base2
  3. WHERE   Translate(Upper(base1.NOM(+)), 'àãâäçéèêëîïôöûüù _-^¨"''', 'aaaaceeeeiioouuu') = Translate(Upper(base2.FIRSNAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu')
  4. AND     Translate(Upper(base1.PRENOM(+)),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu') = Translate(Upper(base2.FIRSTNAME),'àãâäçéèêëîïôöûüù _-^¨"''','aaaaceeeeiioouuu');


Le problème est que je veux faire une jointure externe complète, est-il possible de le faire autrement pour des anciennes versions de oracle basée sur la version 8 ?
Pour les majuscules ne t'inquiète pas, c'est fait exprès de ne pas matcher les accents, je dois juste utiliser les caractères de l'alphabet.

n°1953434
MagicBuzz
Posté le 28-12-2009 à 16:05:17  profilanswer
 

Pour les accents, ce que veut dire Casimimir, c'est que :
 
Upper('ê') = 'Ê'
 
Et que donc quand ton translate arrive, il ne trouve pas le Ê dans ta liste, qui est en minuscule. Du coup... Proutch ;)
 
Mets des "Lower" à la place, pour transformer justement les 'Ê' en 'ê' avant de faire le translate.
 
Sinon, remonte tes manches, et t'as plus qu'à faire une jointure droite sur une jointure gauche... Sâchant qu'Oracle a de totue façon des restrictions à ce niveau, et qu'il y a 50% de chances pour que tu doives passer par une vue intermédiaire ou une sous-requête... :sweat:

n°1953548
casimimir
Posté le 29-12-2009 à 09:17:09  profilanswer
 

d'autre part au moins jusqu'à la version 9, les full outer join consomment énormément de ressource, si ta table contient pas mal de records tu peux t'attendre a ce qu'il mouline comme un peté, d'autant plus que tu passes par un dblink pour l'une de tes deux tables.
 
Perso en 1) je me créerai mes deux tables avec le résultat du translate sur la même instance oracle et en indexant les champs qui vont bien, et en 2) si oracle part en sucette sur le full outer join, je ferai un left + un right + un inner, mergé via un union all.
 
ps: et fais une fonction qui fait ton translate, c'est le genre de truc qui peut resservir


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

  Aide sur jointure externe complête

 

Sujets relatifs
Aide pour projet informatiqueBesoin d'aide en php pour formulaire
Besoin d'aide : recupérer des variables d'une page à l'autre[MySQL] Jointure : Afficher autre chose si pas de résultat?
[Besoin d'aide] jQuery , cherche scroller imagePetite aide en C !
Aide applet java niveau débutantBesoin d'aide en VBA
Aide pour un programme pythonBesoin d'aide pour la programmation d'un menu en html
Plus de sujets relatifs à : Aide sur jointure externe complête


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