Stocker automatiquement une jointure dans une table
Écrit le 18/02/2010
conseils
oracle
sgbd
sql
Une fois n'est pas coutume, j'attire votre attention sur un petit truc tordu à destination des gens qui ont le malheur de toucher à Oracle.
Imaginez-vous avec deux tables R et S dont vous voulez stocker la jointure sur la condition R.aR = S.aS dans une table. Soit, faites-le avec un soupçon de... ceci ?
CREATE TABLE jointurez AS
SELECT * FROM R, S
WHERE R.a = S.b;
Il se trouve qu'il existe des cas dans lesquels vous adoreriez que ça marche, mais là où ça ne marche pas. Le cas typique, c'est quand la table R contient un champ de nom pouet, que S contient lui aussi ce champ, mais que vous ne faites pas la jointure sur ces champs ! Dans ce cas, si la sélection à elle seule marche bien, la table ne se créera jamais car le SGBD ne peut pas aplanir les résultats dans une table : il échoue avec l'erreur "y'a deux champs qu'ont l'même nom, ventrebleu" (erreur ORA-666).
Le problème est que si vous pouvez renommer les attributs du même nom de manière à ce qu'il n'y ait pas de conflit, vous ne pouvez sûrement pas le faire de manière automatique (dans un script, dans une application, dans un rêve que vous ne contrôlez pas directement...).
La solution malpropre est de créer une vue intermédiaire qui accueillera le résultat de la jointure, puis de créer la table qu'on voulait comme une sélection d'autant de colonnes que vous voulez de la vue intermédiaire. Ensuite vous pouvez dire au revoir à votre vue.
Lire l'article en entier