IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

Comparer deux colonnes de deux bases de donnée différentes


Sujet :

Programmation et administration système Perl

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Comparer deux colonnes de deux bases de donnée différentes
    Bonjour,

    je voudrai comparer deux colonnes de deux base de donnée (bd et bd2) et insérer la colonne $row[1] si $row[0] et $row2[0] sont égaux,


    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
            MySQL("select * from worldmap_table");
     
            sub MySQL
            {
                 #Connect to the database.
                 my $dbh = DBI->connect("DBI:mysql:database=db;host=ip",
                 "login", 'password',
                 {'RaiseError' => 1});
     
                 my $query = $_[0];  #assign argument to string
     
                 my $sth = $dbh->prepare($query);   #prepare query
     
                 $sth->execute();   #execute query
     
                 while (my @row = $sth->fetchrow_array)
                     {
                        #print "@row\n";
                        #if (($row[0] and $row[1] and $row[2]) ne undef) {
     
                        #affiche toute les lignes nom_du_serveur nom_du_trigger severity longitude latitude
                        print "$row[0] $row[1] $row[2] $row[3] $row[4]  \n";
     
                         $dbh->disconnect;
                         }
     
        #############second_request######
                MySQL2("select * from worldmap_table2");
     
            sub MySQL2
            {
                 my $dbh = DBI->connect("DBI:mysql:database=**db**;host=ip",
                 "login", 'password',
                     {'RaiseError' => 1});
     
                     my $query = $_[0];  #assign argument to string
     
                     my $sth = $dbh->prepare($query);   #prepare query
     
                     $sth->execute();   #execute query
     
                     while (my @row2 = $sth->fetchrow_array)
                         {
                            print "$row2[0] $row2[1] $row2[2] $row2[3] $row2[4]  \n";
     
                            #$dbh->disconnect;
                         }
     
                }
     
            ########################i want to compare 2 column and insert , its something like that###############
                     my $dbh = DBI->connect("DBI:mysql:database=**db2**;host=ip",
                     "login", 'password',
                     {'RaiseError' => 1});
     
            if ($row[0] = $row2[0]){
     
            insert into worlmap_table (`severity`) values ("$row[0]");
        }

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 857
    Points : 6 555
    Points
    6 555
    Par défaut
    La description de ton problème n'est pas très claire et le code que tu fournis non plus. Est-ce que tu ne pourrais pas plutôt montrer ce que tu as au départ et ce que tu souhaites obtenir à l'arrivé sous cette forme en précisant bien le nom de la base, le nom de la table, éventuellement les noms de colonnes, de cette manière:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    database 1                               database 2
    -----------------------------------      ----------------------------------
    table truc                               table truc2
    -----------------------------------      ----------------------------------
    id   nom       sexe  annee  parti        id   nom       sexe  annee  parti
    -----------------------------------      ----------------------------------
      1  Lapin     M     1784   PS           14   Murène    A     2014   MODEM
    118  Koala     F     1618   LR           33   Fouine    F     1347   EELV
     14  Murène    A     2014   MODEM         2   Castor    M     4218   SP
      3  Ragondin  F     1512   CPNT          3   Ragondin  F     1512   CPNT
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    database 1                               database 2
    -----------------------------------      ----------------------------------
    table truc                               table truc2
    -----------------------------------    ----------------------------------
    id   name        year  parti         id   name         year   parti
    -----------------------------------    ----------------------------------
       1 Lapin                               14   Lapin         2014   MODEM
    118 Koala                              33   Murène      1347   EELV
     14  Murène                              2   Ragondin  4218   SP
      3   Ragondin                            3   Koala       1512   CPNT
    j'aimerai insérer les lignes year et parti depuis la database 2 au database 1 si name de la database 1 et name de la database 2 sont égaux.

    le résultat ressemblerai à sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    database 1                               
    -----------------------------------      
    table truc                               
    -----------------------------------      
    id   name     year  parti        
    -----------------------------------     
      1  Lapin           2014   MODEM                  
    118  Koala         1512   CPNT                     
     14  Murène       1347   EELV                       
      3  Ragondin     4218   SP
    merci pour vos réponses

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 857
    Points : 6 555
    Points
    6 555
    Par défaut
    J'avais rempli la colonne name de la table de la première base juste pour que ce soit plus clair, mais mieux vaut utiliser la première colonne (l'id) pour faire la comparaison.

    Bon, pour exemple on va utiliser les deux bases de données suivantes:
    Code SQL : 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
    CREATE DATABASE IF NOT EXISTS DB_ELECTION1
    DEFAULT CHARSET utf8mb4;
     
    USE DB_ELECTION1;
     
    CREATE TABLE IF NOT EXISTS T_CANDIDAT (
        CAN_ID INT UNSIGNED NOT NULL PRIMARY KEY,
        CAN_NAME VARCHAR(50),
        CAN_SEX ENUM('F', 'M', 'O'),
        CAN_YEAR YEAR,
        CAN_PARTY VARCHAR(50)
    ) ENGINE InnoDB;
     
    INSERT INTO T_CANDIDAT (CAN_ID, CAN_NAME, CAN_SEX, CAN_YEAR, CAN_PARTY)
    VALUES 
        (1, 'Lapin', NULL, NULL, NULL),
        (118, 'Koala', NULL, NULL, NULL),
        (14, 'Murène', NULL, NULL, NULL),
        (3, 'Ragondin', NULL, NULL, NULL);

    soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    database: DB_ELECTION1
    --------------------------------
    table: T_CANDIDAT
    --------------------------------
    CAN_ID | CAN_NAME | CAN_SEX | CAN_YEAR | CAN_PARTY
    -------+----------+---------+----------+-----------
         1 | Lapin    | NULL    | NULL     | NULL
    -------+----------+---------+----------+-----------
       118 | Koala    | NULL    | NULL     | NULL
    -------+----------+---------+----------+-----------
        14 | Murène   | NULL    | NULL     | NULL
    -------+----------+---------+----------+-----------
         3 | Ragondin | NULL    | NULL     | NULL
    -------+----------+---------+----------+-----------
    À noter que les colonnes qui vont éventuellement être remplies avec les données de l'autre base sont déjà présentes et nullables. Si ce n'est pas le cas pour ta table il faudra le faire en utilisant ALTER TABLE.

    Pour ce qui est de l'autre base:
    Code SQL : 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
    CREATE DATABASE IF NOT EXISTS DB_ELECTION2
    DEFAULT CHARSET utf8mb4;
     
    USE DB_ELECTION2;
     
    CREATE TABLE IF NOT EXISTS T_CANDIDAT (
        CAN_ID INT UNSIGNED NOT NULL PRIMARY KEY,
        CAN_NAME VARCHAR(50) NOT NULL,
        CAN_SEX ENUM('F', 'M', 'O') NOT NULL,
        CAN_YEAR YEAR NOT NULL,
        CAN_PARTY VARCHAR(50) NOT NULL
    ) ENGINE InnoDB;
     
    INSERT INTO T_CANDIDAT (CAN_ID, CAN_NAME, CAN_SEX, CAN_YEAR, CAN_PARTY)
    VALUES
        (14, 'Murène', 'O', 2014, 'MODEM'),
        (33, 'Fouine', 'F', 1947, 'EELV'),
        (2, 'Castor', 'M', 2018, 'SP'),
        (3, 'Ragondin', 'F', 1912, 'CNPT');

    soit:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    database: DB_ELECTION2
    --------------------------------
    table: T_CANDIDAT
    --------------------------------
    CAN_ID | CAN_NAME | CAN_SEX | CAN_YEAR | CAN_PARTY
    -------+----------+---------+----------+-----------
        14 | Murène   | O       | 2014     | MODEM
    -------+----------+---------+----------+-----------
        33 | Fouine   | F       | 1947     | EELV
    -------+----------+---------+----------+-----------
         2 | Castor   | M       | 2018     | SP
    -------+----------+---------+----------+-----------
         3 | Ragondin | F       | 1912     | CNPT
    -------+----------+---------+----------+-----------


    On va d'abord partir du principe que les bases de données sont sur des serveurs différents.

    L'algorithme est très simple:
    • Je récupère les ids de la table de la première base et je les mets comme clef d'un hash, ce qui permet de facilement vérifier qu'un id existe.
    • Je boucle sur les enregistrements de la table de la seconde base, et lorsque l'id est présent dans le hash, je mets à jour l'enregistrement correspondant dans la table de la première base



    Ça donne ça:
    Code perl : 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
    44
    use strict;
    use warnings;
    use DBI;
     
    my $dsn1 = "dbi:mysql:dbname=DB_ELECTION1";
    my $username1 = "username1";
    my $password1 = "password1";
     
    my $dsn2 = "dbi:mysql:dbname=DB_ELECTION2";
    my $username2 = "username2";
    my $password2 = "password2";
     
    my $dbh1 = DBI->connect($dsn1, $username1, $password1, { RaiseError => 1 })
        or die $DBI::errstr;
     
    my $sth1 = $dbh1->prepare("SELECT CAN_ID FROM T_CANDIDAT");
    $sth1->execute();
     
    my %idDB1;
     
    while ( my ($id) = $sth1->fetchrow() ) {
        $idDB1{$id} = 1;
    }
     
    my $dbh2 = DBI->connect($dsn2, $username2, $password2, { RaiseError => 1 })
        or die $DBI::errstr;
     
    my $sth2 = $dbh2->prepare("SELECT CAN_ID, CAN_NAME, CAN_SEX, CAN_YEAR, CAN_PARTY
                               FROM T_CANDIDAT");
    $sth2->execute();
     
    while ( my ($id, $name, $sex, $year, $party) = $sth2->fetchrow() ) {
        if ( $idDB1{$id} ) {
            $dbh1->do("UPDATE T_CANDIDAT 
                       SET CAN_NAME = '$name',
                           CAN_SEX = '$sex',
                           CAN_YEAR = $year,
                           CAN_PARTY = '$party' 
                       WHERE CAN_ID = $id");
        }
    }
     
    $dbh2->disconnect();
    $dbh1->disconnect();




    Par contre, si les deux bases de données sont sur le même serveur, on peut faire beaucoup plus direct.

    Tout d'abord, tu peux carremment de passer de Perl ou d'un quelconque langage, puisque tu peux faire l'opération directement en SQL:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UPDATE DB_ELECTION1.T_CANDIDAT
     
    INNER JOIN DB_ELECTION2.T_CANDIDAT
    ON DB_ELECTION1.T_CANDIDAT.CAN_ID = DB_ELECTION2.T_CANDIDAT.CAN_ID
     
    SET
        DB_ELECTION1.T_CANDIDAT.CAN_NAME = DB_ELECTION2.T_CANDIDAT.CAN_NAME,
        DB_ELECTION1.T_CANDIDAT.CAN_SEX = DB_ELECTION2.T_CANDIDAT.CAN_SEX,
        DB_ELECTION1.T_CANDIDAT.CAN_YEAR = DB_ELECTION2.T_CANDIDAT.CAN_YEAR,
        DB_ELECTION1.T_CANDIDAT.CAN_PARTY = DB_ELECTION2.T_CANDIDAT.CAN_PARTY
    WHERE DB_ELECTION1.T_CANDIDAT.CAN_ID > 0 ;

    Maintenant si tu veux absolument passer par un script Perl, tu peux considérablement simplifier le script du début dans la mesure où tu n'as besoin que d'un seul dbh, et que tu peux obtenir directement les enregistrements de la deuxième base dont l'id existe dans la première en faisant un requête avec jointure:

    Code perl : 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
    use strict;
    use warnings;
    use DBI;
     
    my $dsn = "dbi:mysql:dbname=DB_ELECTION1";
     
    my $username = "username";
    my $password = "password";
     
    my $dbh = DBI->connect($dsn, $username, $password, { RaiseError => 1 })
        or die $DBI::errstr;
     
    my $sth = $dbh->prepare("SELECT DB_ELECTION2.T_CANDIDAT.*
                             FROM DB_ELECTION2.T_CANDIDAT
                             INNER JOIN DB_ELECTION1.T_CANDIDAT
                             ON DB_ELECTION1.T_CANDIDAT.CAN_ID = DB_ELECTION2.T_CANDIDAT.CAN_ID");
    $sth->execute();
     
    while ( my ($id, $name, $sex, $year, $party) = $sth->fetchrow() ) {
        $dbh->do("UPDATE T_CANDIDAT 
                  SET CAN_NAME = '$name',
                      CAN_SEX = '$sex',
                      CAN_YEAR = $year,
                      CAN_PARTY = '$party' 
                  WHERE CAN_ID = $id");
    }
     
    $dbh->disconnect();
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. Réponses: 13
    Dernier message: 18/05/2015, 10h38
  2. [XL-2010] Comparer deux bases de données pour en créer une troisième
    Par Xaphalys dans le forum Excel
    Réponses: 5
    Dernier message: 24/07/2014, 13h24
  3. Comparer deux base de données
    Par adrienfehr dans le forum Modélisation
    Réponses: 4
    Dernier message: 01/04/2010, 07h23
  4. Joindre des tables de deux bases de données différentes
    Par jf1985 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/09/2007, 12h23
  5. Réponses: 3
    Dernier message: 24/09/2007, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo