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 :

Comparaison de tables


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 233
    Points : 92
    Points
    92
    Par défaut Comparaison de tables
    Bonjour,

    Je suis face à un problème que je n'arrive pas encore à résoudre.
    Pour l'exemple, admettons que j'ai 2 tables:

    Code   Date       Prix
      1       10/01       12
      2       04/01       15
      3       15/02       20
    Code   Date       Prix
      1       10/01       12
      2       04/01       13
      3       12/04       20
      4       01/08       10

    Dans le but de les comparer, j'arrive à afficher grâce à une query une liste contenant les codes communs aux 2 tables et leurs caractéristiques pour chaque table comme suit:

    Code      Date1      Date2     Prix1     Prix2
      1       10/01      10/01     12        12
      2       04/01      04/01     15        13
      3       15/02      12/04     20        20

    Mais comment puis-je remplir uniquement les caractéristiques qui diffèrent?
    exemple de ce que j'aimerai obtenir:

    Code      Date1      Date2     Prix1     Prix2
      1       
      2                            15        13
      3       15/02      12/04     
    Merci d'avance pour votre aide!

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    L'opérateur UNION peut vous aider. Par exemple :

    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
    SELECT x.Code, '','', '', ''  
    FROM   T1 AS x JOIN T2 AS y ON x.Code = y.Code 
           AND  x.Date = y.Date
           AND  x.Prix = y.Prix
    UNION
    SELECT x.Code, '', '', x.Prix, y.Prix  
    FROM   T1 AS x JOIN T2 AS y ON x.Code = y.Code 
           AND  x.Date = y.Date
           AND  x.Prix <> y.Prix
    UNION
    SELECT x.Code, x.Date, y.Date, '', ''  
    FROM   T1 AS x JOIN T2 AS y ON x.Code = y.Code 
           AND  x.Date <> y.Date
           AND  x.Prix = y.Prix ;
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 233
    Points : 92
    Points
    92
    Par défaut
    Merci beaucoup pour votre aide fsmrel!

    Par contre, j'ai juste donné un exemple. En réalité, j'ai 3 millions de lignes donc je ne peux pas construire chaque ligne avec une union (si j'ai bien compris votre code?! ).
    Je souhaiterai connaitre la syntaxe ou le mot clé qui me permettrait de remplir en blanc les cellules où les caractéristiques sont identiques pour un même code dans les 2 tables.
    J'ai pensé aux
    if
    combiné à un
    alter table
    comme j'arrive à afficher:

    Code Date1 Date2 Prix1 Prix2
    1 10/01 10/01 12 12
    2 04/01 04/01 15 13
    3 15/02 12/04 20 20

    Mais je ne trouve pas la syntaxe puisque cela ne compile pas...

    Est-ce que je fais fausse route selon vous?

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    A priori, Trois millions de lignes ça n’est pas mortel. Enfin ça peut dépendre du SGBD. Quel est-il ?

    De toute façon, étant donné que les trois SELECT produisent trois ensembles disjoints, histoire de gagner du temps (éviter des tris inutiles en l’occurrence), on peut remplacer UNION par UNION ALL. Le temps de parcours est au pire trois fois le temps de parcours unitaire de la jointure des deux tables, ce qui est quand même humainement supportable, faites un test et chronométrez.


    Citation Envoyé par bilou_12 Voir le message
    Est-ce que je fais fausse route selon vous?
    Oui. Je ne vois pas la logique qui se cache derrière le mélange d’instructions du LDD (Langage de description des données) telles que « ALTER TABLE » et d’instructions du LMD (Langage de manipulation de données).

    Quoi qu’il en soit, pour avoir des colonnes « à blanc » dans le résultat, il suffit que ces colonnes soient du même type, disons VARCHAR, ce qui entraîne l’utilisation de la fonction CAST pour les données numériques, c'est-à-dire les prix.


    Exemple (avec SQL Server) :

    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
    SELECT x.Code, '' AS Date1, '' AS Date2, '' AS Prix1, '' AS Prix2
    FROM   T1 AS x JOIN T2 AS y ON x.Code = y.Code 
           AND  x.Date = y.Date
           AND  x.Prix = y.Prix
    UNION ALL
    SELECT x.Code, '', '', CAST(x.Prix AS VARCHAR(10)), CAST(y.Prix AS VARCHAR(10))  
    FROM   T1 AS x JOIN T2 AS y ON x.Code = y.Code 
           AND  x.Date = y.Date
           AND  x.Prix <> y.Prix
    UNION ALL
    SELECT x.Code, x.Date, y.Date, '', ''  
    FROM   T1 AS x JOIN T2 AS y ON x.Code = y.Code 
           AND  x.Date <> y.Date
           AND  x.Prix = y.Prix ;

    Au résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Code    Date1    Date2    Prix1    Prix2
    ----------------------------------------
       1
       2                         15       13
       3   15/0     12/04
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Vous pouvez aussi faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
    		T1.Code,
    		CASE WHEN T1.Date <> T2.Date THEN T1.Date END AS Date1,
    		CASE WHEN T1.Date <> T2.Date THEN T2.Date END AS Date2,
    		CASE WHEN T1.Prix <> T2.Date THEN T1.Prix END AS Prix1,
    		CASE WHEN T1.Prix <> T2.Date THEN T2.Prix END AS Prix2
    FROM	T1
    INNER JOIN T2
    	ON		T2.code = T1.code
    Si vous préférez des "blanc" à la place des NULL, alors comme disait fsmrel, il faudra transtyper...

Discussions similaires

  1. [debutant]comparaison de table
    Par manshoon dans le forum Langage SQL
    Réponses: 6
    Dernier message: 15/06/2006, 16h49
  2. Comparaison entre tables
    Par Marmouz dans le forum Access
    Réponses: 3
    Dernier message: 13/04/2006, 15h21
  3. [SQL] vs [VBA] comparaison de tables et mise à jour
    Par borisa dans le forum VBA Access
    Réponses: 4
    Dernier message: 09/02/2006, 10h15
  4. accélérer la comparaison de tables
    Par mick84m dans le forum SQL Procédural
    Réponses: 16
    Dernier message: 10/12/2005, 12h06
  5. comparaison de tables
    Par amelie15 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/04/2005, 10h37

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