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

Langage SQL Discussion :

Comparer 2 tables dont la structure est la même


Sujet :

Langage SQL

  1. #1
    Membre averti
    Homme Profil pro
    Chef de projets Décisionnel
    Inscrit en
    Juillet 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projets Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 263
    Points : 320
    Points
    320
    Par défaut Comparer 2 tables dont la structure est la même
    Bonjour,

    Je retrouve une table, identique dans sa structure, dans plusieurs bases différentes sous SQL SERVER 2008 R2

    J'aimerais bien construire une analyse qui consiste à produire les différences retrouvées entre les différentes bases.

    Il me semble qu'il existe un outil pour ça.
    Sinon en SQL vous feriez comment :
    1. LEFT JOIN

    2. INTERSECT / EXCEPT ?
    use Boisson;
    select a.*
    from dbo.FOR_PARAM$ as a
    UNION
    select b.*
    from dbo.FOU_FAX_PARAM$ as b;

    Merci

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Et bien tout dépend de ce que vous voulez comparer

    - identifiants fonctionnels seulement
    - identifiants techniques (chronos, identity etc...) (ex : votre base est sensée être un backup, mais vous avez des doutes sur son intégrité)
    - identifiants + données fonctionnelles
    - identifiants + données fonctionnelles + mouchards de mise à jour (horodatage, user...)

    Parceque si vous avez beaucoup de colonnes dans vos tables, selon le résultat attendu, la solution ne passe pas forcément pas du SQL, une comparaison de fichiers plats peut être plus adaptée
    N'oubliez pas que les prédicats "différent" ne sont pas sargables (pas de filtrage par index possible) et sur des tables volumineuses larges ou obèses (càd avec beaucoup de colonnes), ça peut couter très très cher.

    Communiquez le DDL de vos tables et index, la volumétrie, et précisez les colonnes que vous souhaitez comparer

  3. #3
    Membre averti
    Homme Profil pro
    Chef de projets Décisionnel
    Inscrit en
    Juillet 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projets Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 263
    Points : 320
    Points
    320
    Par défaut
    Hello


    Citation Envoyé par escartefigue Voir le message
    - identifiants + données fonctionnelles
    Uniquement les données fonctionnelles Oui

    Parce que si vous avez beaucoup de colonnes dans vos tables...
    Non Chaque table à le même nombre de colonnes donc 7

    ...sur des tables volumineuses larges ou obèses (càd avec beaucoup de colonnes), ça peut couter très très cher.
    J'ai moins de 2000 lignes dans chaque tables

    Selon le résultat attendu, la solution ne passe pas forcément pas du SQL, une comparaison de fichiers plats peut être plus adaptée
    J'ai déjà extrait un fichier excel par table table. Je cherche une méthode pour les analyser : Plus en Base ou avec les fichiers mais par quel moyen ?
    Tu as une idée ?

    Merci pour tes lumières

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    S'il n'y a que 2000 lignes et 7 colonnes, une solution SQL suffit, vous pouvez par exemple procéder par jointure "FULL OUTER" pour appareiller les 2 tables

    Exemple de solution possible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select t1.col1
         , t1.col2
         , t2.col2
         ...
         , t1.col7
         , t2.col7
    from            xxxx.table1 as t1
    full outer join yyyy.table1 as t2
      on t2.col1 = t1.col1
    where t1.col2 <> t2.col2
       or t1.col1 <> t2.col3
       ...
       or t1.col7 <> t2.col7
    Evidemment, sauf si les 2 tables sont réputées strictement identiques (genre backup l'une de l'autre) les critères de jointures ne peuvent pas être des identifiants techniques (identity column, séquence ou autre)

  5. #5
    Membre averti
    Homme Profil pro
    Chef de projets Décisionnel
    Inscrit en
    Juillet 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projets Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 263
    Points : 320
    Points
    320
    Par défaut Soluce trouvée
    Hello,

    Je n'ai pas trouvé d'utilitaire ou outil SGBD qui réalise cette conversion, dommage. Je suis sûr que ça existe, ça relève pourtant, des taches d'administration de BDD... Quand j'aurai un moment, je chercherai

    Voici la solution que j'ai mise en place entre 2 colonnes paramètres de 2 tables différentes (cas où un paramétrage est répliqué sur plusieurs environnements..)

    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
    select CAR.par_cdpar
    ,'CD_CODE_PIECE' as val_param--Colonne à comparer sous forme de constante
    , cast(CAR.PAR_CDPAR as varchar) as rou_valeur--Table 1 de comparaison
    , cast(FZA.PAR_CDPAR as varchar) as ukr_valeur--Table 2 de comparaison
    from MGCAR_CAR CAR
    join MGCAR_FZA FZA on (FZA.par_cdpar = CAR.par_cdpar--jointure et filtres de jointure
                      and FZA.par_cdsoc = CAR.par_cdsoc
                      and FZA.par_dtdeb = CAR.par_dtdeb
                      and FZA.par_dtfin = CAR.par_dtfin
                      and FZA.par_cdutil = CAR.par_cdutil
                      )
    where CAR.PAR_CDPAR <> FZA.PAR_CDPAR--Comparer les différences
     
    union all
     
    Copier et adapter la même requête en changeant les paramètres
    Au bout, ça m'a donné un tableau qui compile toutes les différences que j'ai trouvées dans chaque champ analysé

    Merci pour ton aide @escartfigue. Ça fait toujours du bien de discuter

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparer 2 date dont l'annee est differente
    Par kam81 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 11/02/2007, 00h14
  2. Réponses: 6
    Dernier message: 08/02/2007, 14h41
  3. Réponses: 4
    Dernier message: 27/12/2006, 21h53
  4. Accéder à une table dont le nom est dans une table
    Par claralavraie dans le forum Oracle
    Réponses: 7
    Dernier message: 26/12/2006, 15h51
  5. Réponses: 2
    Dernier message: 08/03/2006, 22h06

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