Bonjour à tous,
Je suis actuellement en train d'essayer de construire une vue qui reporte les différences entre deux tables de structure identique. Voici la structure en question :
# Colonne
1 type
2 ip_address
3 port_num
4 domain_name
5 mid_string
Ma vue doit contenir les différences trouvées pour chaque couple de clefs et chaque champs. S'il n'y a pas de différence la vue n'affiche rien. Voici la structure de la vue que j'ai réalisée :
# Colonne
1 table // nom de la table comparée
2 key // clé de la ligne comparée
3 field // champ comparé
4 reference // valeur dans la première table
5 work // valeur dans al deuxième table
Voici le code que j'ai écrit pour créer ma vue et pour que la détection des différences soit automatique :
Ce code fonctionne mais il est très lourd et ne fonctionne que pour une structure de table spécifique. Afin de gérer les différences sur d'autres structures de table, j'ai copié ce code et je l'ai adapté à d'autres structures(en changeant le nom des tables et des champs dans le code). Et grâce au mot clef UNION j'ai pu concaténer le tout afin que ma vue affiche les différences entre de 2 bases de même structure.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 CREATE VIEW differences AS SELECT "h248_vmg5_vmg_ip_information" AS "table", CONCAT(`t1`.`ip_address`,"-",`t1`.`port_num`) AS "key", "type" AS "field", `t1`.`type` AS "reference", `t2`.`type` AS "work" FROM `gpy_7510_R4_ref`.`h248_vmg5_vmg_ip_information` `t1` LEFT JOIN `gpy_7510_R4_tra`.`h248_vmg5_vmg_ip_information` `t2` ON `t1`.`ip_address`=`t2`.`ip_address` AND `t1`.`port_num`=`t2`.`port_num` HAVING ( `reference`<>`work` OR `reference` IS NULL OR `work` IS NULL ) UNION SELECT "h248_vmg5_vmg_ip_information" AS "table", CONCAT(`t1`.`ip_address`,"-",`t1`.`port_num`) AS "key", "domain_name" AS "field", `t1`.`domain_name` AS "reference", `t2`.`domain_name` AS "work" FROM `gpy_7510_R4_ref`.`h248_vmg5_vmg_ip_information` `t1` LEFT JOIN `gpy_7510_R4_tra`.`h248_vmg5_vmg_ip_information` `t2` ON `t1`.`ip_address`=`t2`.`ip_address` AND `t1`.`port_num`=`t2`.`port_num` HAVING ( `reference`<>`work` OR `reference` IS NULL OR `work` IS NULL ) UNION SELECT "h248_vmg5_vmg_ip_information" AS "table", CONCAT(`t1`.`ip_address`,"-",`t1`.`port_num`) AS "key", "mid_string" AS "field", `t1`.`mid_string` AS "reference", `t2`.`mid_string` AS "work" FROM `gpy_7510_R4_ref`.`h248_vmg5_vmg_ip_information` `t1` LEFT JOIN `gpy_7510_R4_tra`.`h248_vmg5_vmg_ip_information` `t2` ON `t1`.`ip_address`=`t2`.`ip_address` AND `t1`.`port_num`=`t2`.`port_num` HAVING ( `reference`<>`work` OR `reference` IS NULL OR `work` IS NULL )
Le problème est que le traitement est du coup abominablement long rien que pour afficher la vue à cause de la longueur du code de la vue (celui du dessus en 350 fois plus long car 350 tables dans la base)
Alors quelqu'un pourrait-il m'aider à réduire et simplifier mon code afin d'obtenir des délais d'interrogation convenables ? Je pense que ce code est loin d'être optimisé...
Merci.
Partager