Aide sur jointure externe complête

Aide sur jointure externe complête - SQL/NoSQL - Programmation

Marsh Posté le 28-12-2009 à 12:00:12    

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.

Reply

Marsh Posté le 28-12-2009 à 12:00:12   

Reply

Marsh Posté le 28-12-2009 à 14:30:40    

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
Reply

Marsh Posté le 28-12-2009 à 15:59:31    

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.

Reply

Marsh Posté le 28-12-2009 à 16:05:17    

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:

Reply

Marsh Posté le 29-12-2009 à 09:17:09    

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

Reply

Sujets relatifs:

Leave a Replay

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