Conception que j arrive pas à modeliser (jointures externes inside)

Conception que j arrive pas à modeliser (jointures externes inside) - SQL/NoSQL - Programmation

Marsh Posté le 23-02-2009 à 19:44:56    

Bonjour je dois sortir un flux provenant d'un delta entre deux tables.
 
Je schématise la partie qui me pose problème la.
Deux tables de structures identiques J et JM1
User
Role
Modificateur
Date_Modif
 
La clé sur User-Role
Maintenant le truc tordu
4 cas possible
Pour un utilisateur donné :
1/ Aucune modification les données dans J et JM1 sont absolument les memes
2/ Des lignes en plus dans J
3/ Des lignes en plus dans JM1
4/ Des lignes en plus dans J et JM1
 
Cas 1 : On ne fait rien
Cas 2 : On ressort la ligne de J qui a la date_modif la plus recente (l id role ne nous interresse plus)
Cas 3 : On ressort  la ligne  JM1 qui a la date_modif la plus recente (l id role ne nous interresse plus)
Cas 4 : On ressort la ligne de J ou JM1  qui a la date_modif la plus recente (l id role ne nous interresse plus)
 
Et en fait j'arrive pas à reconnaitre dans quel cas on est
On aurait jamais le cas 4 avec des requetes externes j'aurais la soluce, mais le cas 4 me pose problème
Pour ressortir la bonne ligne ensuite je pense que je trouverais la solution
 
 
Cas concret pour bien expliqué
J
21 1 seb 2009
21 2 marie 2008
20 1 seb 2004
19 1 seb 2005
19 3 marie 2009
10 1 nathan 2006
 
JM1
21 2 marie 2008
20 1 seb 2004
20 2 luc 2009
19 1 seb 2009
19 2 eric 2007
18 1 nathan 2006
 
Cas 1 : user 18
Cas 2 : user 21
Cas 3 : user 20
Cas 4 : user 19
 
Table finale Delta
21 seb 2009
20 luc 2009
19 marie 2009

Reply

Marsh Posté le 23-02-2009 à 19:44:56   

Reply

Marsh Posté le 24-02-2009 à 10:06:22    

en gros, t'essayes de faire un diff entre 2 tables puis de les synchroniser avec les données les plus récentes.
Je pense qu'en requêtes SQL ça va être trop compliqué. Je me souviens, je voulais juste faire un diff entre 2 objets stockés en bases, ces objets se présentant sous la forme d'arborescences de composants et d'attributs et MagicBuzz m'avait conseillé de le faire en script php (l'appli reposait sur Mysql et PHP).
Tu es sous quel SGBD et quel langage de programmation. Si t'es sous un sgbd qui gère bien les procédures stockées, tu peux peut-être le faire comme ça, sinon avec le langage de programmation, ça sera sans doute plus performant qu'une ignoble et énorme requête SQL (voire plusieurs)...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 24-02-2009 à 10:14:14    

Voila le topic dont je parlais : http://forum.hardware.fr/hfr/Progr [...] m#t1480707
 
On n'a jamais réussi à faire un diff en SQL (avec le MCD que j'avais). Je l'ai fait en PHP et ça marche nickel et c'est rapide (je charge juste les 2 confs dans 2 variables php et je les traite.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 24-02-2009 à 10:27:05    

Justement dans mon cas, j'ai le droit qu'à Oracle mais pas au pl/sql
La conception se fait dans un ETL (datawarehouse) et j'ai donc juste des connecteurs oracles que je peux surcharger avec des requetes
 
Pour l'instant ou j'ai le plus avancé
Jointure externe avec JM1 is null => j'aurais toutes les nouvelles lignes dans J je recupere les users => DJ
Jointure externe avec J is null => j'aurais toutes les nouvelles lignes dans JM1 je recupere les users => DJM1
 
DJ - DJM1 => ca devrait me donner les users qui ont étés modifiés que dans J => UJ
DJM1 - DJ => ca devrait me donner les users qui ont étés modifiés que dans JM1 => UJM1
 
DJ + DJM1 - UJ - UJM1 devrait si je dis pas de betises me donner les utilisateurs qui ont été modifiés dans J et JM1

Reply

Marsh Posté le 24-02-2009 à 12:02:26    

Mon idée de solution :

 
Code :
  1. -- Création Cas (2,4) minus (3,4) => cas 2
  2. SELECT j.usert --Cas 2, 4
  3.   FROM ttsebtest_j j                                               
  4. WHERE NOT EXISTS (SELECT usert, ROLE
  5.                      FROM ttsebtest_jm1 jm1
  6.                     WHERE j.usert = jm1.usert AND j.ROLE = jm1.ROLE)
  7. MINUS
  8. SELECT jm1.usert --Cas 3, 4
  9.   FROM ttsebtest_jm1 jm1                                           
  10. WHERE NOT EXISTS (SELECT usert, ROLE
  11.                      FROM ttsebtest_j j
  12.                     WHERE j.usert = jm1.usert AND j.ROLE = jm1.ROLE)
  13. -- Suppression Cas (3,4) minus (2,4) => cas 3
  14. /* Formatted on 2009/02/24 12:19 (Formatter Plus v4.8.5) */
  15. SELECT jm1.usert --Cas 3, 4
  16.   FROM ttsebtest_jm1 jm1                                           
  17. WHERE NOT EXISTS (SELECT usert, ROLE
  18.                      FROM ttsebtest_j j
  19.                     WHERE j.usert = jm1.usert AND j.ROLE = jm1.ROLE)
  20. MINUS
  21. SELECT j.usert  --Cas 2, 4
  22.   FROM ttsebtest_j j                                             
  23. WHERE NOT EXISTS (SELECT usert, ROLE
  24.                      FROM ttsebtest_jm1 jm1
  25.                     WHERE j.usert = jm1.usert AND j.ROLE = jm1.ROLE)
  26. --Création et Suppression
  27. -- cas (2,4) union (3,4) minus (cas 2) minus (cas 3) => cas 4
  28. SELECT j.usert --Cas (2,4)
  29.   FROM ttsebtest_j j                                             
  30. WHERE NOT EXISTS (SELECT usert, ROLE
  31.                      FROM ttsebtest_jm1 jm1
  32.                     WHERE j.usert = jm1.usert AND j.ROLE = jm1.ROLE)
  33. UNION
  34. SELECT jm1.usert --Cas (3,4)
  35.   FROM ttsebtest_jm1 jm1                                         
  36. WHERE NOT EXISTS (SELECT usert, ROLE
  37.                      FROM ttsebtest_j j
  38.                     WHERE j.usert = jm1.usert AND j.ROLE = jm1.ROLE)
  39. MINUS
  40. (SELECT j.usert
  41.    FROM ttsebtest_j j
  42.   WHERE NOT EXISTS (SELECT usert, ROLE
  43.                       FROM ttsebtest_jm1 jm1
  44.                      WHERE j.usert = jm1.usert AND j.ROLE = jm1.ROLE)
  45. MINUS
  46. SELECT jm1.usert
  47.    FROM ttsebtest_jm1 jm1
  48.   WHERE NOT EXISTS (SELECT usert, ROLE
  49.                       FROM ttsebtest_j j
  50.                      WHERE j.usert = jm1.usert AND j.ROLE = jm1.ROLE))
  51. MINUS
  52. (SELECT jm1.usert
  53.    FROM ttsebtest_jm1 jm1
  54.   WHERE NOT EXISTS (SELECT usert, ROLE
  55.                       FROM ttsebtest_j j
  56.                      WHERE j.usert = jm1.usert AND j.ROLE = jm1.ROLE)
  57. MINUS
  58. SELECT j.usert
  59.    FROM ttsebtest_j j
  60.   WHERE NOT EXISTS (SELECT usert, ROLE
  61.                       FROM ttsebtest_jm1 jm1
  62.                      WHERE j.usert = jm1.usert AND j.ROLE = jm1.ROLE))
 

Ensuite au vu des résultats je refais des jointures la ou il faut


Message édité par Sebastien le 24-02-2009 à 12:21:24
Reply

Sujets relatifs:

Leave a Replay

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