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 les lignes de 2 tables


Sujet :

Langage SQL

  1. #1
    Membre régulier Avatar de Cvanhove
    Homme Profil pro
    Concepteur Développeur Informatique
    Inscrit en
    Septembre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Concepteur Développeur Informatique

    Informations forums :
    Inscription : Septembre 2014
    Messages : 174
    Points : 70
    Points
    70
    Par défaut Comparer les lignes de 2 tables
    Bonjour,

    Cela fait longtemps que je n'ai pas fais de SQL et je suis un peu perdu.
    J'ai 2 tables (A et B) identiques (num, nb1, nb2, nb 3), je cherche à comparer les données de ses 2 tables afin d'en ressortir les lignes en commun sous certaine condition.
    Mes colonnes nb peuvent prendre des valeurs (1, 2, 3, etc...) dont 0 et null. Je cherche a savoir entre ces 2 tables qu'elles sont les lignes qui sont à 0 ou à null dans les 2 tables.
    J'ai un peu de mal a construire ma requête, si vous pouviez m'aider ce serait gentil.

    Cordialement
    Cordialement, le volatile!
    "Crôa, Crôa"

  2. #2
    Membre régulier Avatar de Cvanhove
    Homme Profil pro
    Concepteur Développeur Informatique
    Inscrit en
    Septembre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Concepteur Développeur Informatique

    Informations forums :
    Inscription : Septembre 2014
    Messages : 174
    Points : 70
    Points
    70
    Par défaut
    J'ai oublié de préciser qu'il y a une date et que c'est la seul chose qui diffère entre les deux tables (dates courantes pour l'une et date histo pour l'autre) Je n peux donc pas utiliser intersect entre les deux tables car il ne retournera rien a cause de la date qui n'est pas la même...
    Cordialement, le volatile!
    "Crôa, Crôa"

  3. #3
    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,

    Postez une jeu d'essai avec le résultat attendu, ce sera bien plus simple pour vous aider.

  4. #4
    Membre régulier Avatar de Cvanhove
    Homme Profil pro
    Concepteur Développeur Informatique
    Inscrit en
    Septembre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Concepteur Développeur Informatique

    Informations forums :
    Inscription : Septembre 2014
    Messages : 174
    Points : 70
    Points
    70
    Par défaut
    Bonjour,

    en fait je simplifie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Tables 1
    2017-12-30 | num1 | 1 | 2 | 3
    2017-12-30 | num2 | 0 | 0 | 0
    2017-12-23 | num3 | 0 | 0 | 0
     
    Tables 2
    2017-12-23 | num1 | 1 | 2 | 3
    2017-12-23 | num2 | 4 | 5 | 6
    2017-12-23 | num3 | 0 | 0 | 0
     
    résultat attendu :
    2017-12-23 | num3 | 0 | 0 | 0
    je souhaite ressortir les lignes en commun sur mes deux tables, et qui ont les colonnes nb à 0 ou null
    Cordialement, le volatile!
    "Crôa, Crôa"

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Tout simplement avec une jointure INNER qui vérifie que les colonnes nb valent zéro ou sont marquées "null" dans chacune des deux tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select T1.xdate
         , T1.xnum
         , T1.nb1
         , T1.nb2
         , T1.nb3
    from ma_table as T1
    inner join ma_table as T2
      on T2.num = T1.num
    where (    (T1.nb1 is null or T1.nb1=0)
           and (T1.nb2 is null or T1.nb2=0)
           and (T1.nb3 is null or T1.nb3=0))
      and (    (T2.nb1 is null or T2.nb1=0)
           and (T2.nb2 is null or T2.nb2=0)
           and (T2.nb3 is null or T2.nb3=0))

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM   ma_table as T1
           JOIN ma_table as T2 ON T2.num = T1.num
    WHERE  COALESCE(T1.nb1, 0) =  COALESCE(T2.nb1, 0)
      AND  COALESCE(T1.nb2, 0) =  COALESCE(T2.nb2, 0)
      AND  COALESCE(T1.nb3, 0) =  COALESCE(T2.nb3, 0)
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    INTERSECT fait bien le travail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select dt, num, nb1, nb2, nb3 from tab1
    intersect
    select dt, num, nb1, nb2, nb3 from tab2;

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Ca ne va pas, il manque la condition de nullité ou de valeur égale à zéro

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Effectivement j'ai mal compris l'énoncé, j'ai cru que les colonnes pouvaient contenir du 0/null.
    J'ai une question du coup, est-ce que les données ci-après sont considérées comme équivalentes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Tab1
    date '2017-12-23', 'num3', 0, 0, null 
     
    Tab2
    date '2017-12-23', 'num3', 0, null, 0

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Je l'ai compris ainsi d'où le double test 0/null dans ma proposition, simplifiée à juste titre par l'utilisation de COALESCEpar SQLPro

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/09/2006, 09h08
  2. Réponses: 2
    Dernier message: 15/09/2006, 12h18
  3. [Tableaux] Comparer les lignes d'un même tableau
    Par derfatypik dans le forum Langage
    Réponses: 5
    Dernier message: 06/01/2006, 12h14
  4. Réponses: 4
    Dernier message: 11/10/2005, 15h03
  5. Compter les lignes d une <TABLE>
    Par Invité(e) dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/01/2005, 14h43

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