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

MS SQL Server Discussion :

transact sql [Débutant(e)] [2008R2]


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 28
    Points : 26
    Points
    26
    Par défaut transact sql
    Bonjour,

    J'ai un petit souci sur la formulation d'une requête SQL:

    liste des noms du client en cours (table0) ayant une ligne dans Table1 et pas encore dans Table2.

    Sachant que table1 et table2 ont la clé idClient de la table0

    Merci pour votre retour

  2. #2
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Et bien c'est simple, il suffit de composer la requête en plusieurs "étapes"

    1 - on va chercher la liste des users présents dans table1 mais absents de table 2

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT idClient
      FROM table1
     WHERE NOT EXISTS ( SELECT NULL
                          FROM table2
                         WHERE table1.idClient = table2.idClient );

    Ensuite, on peut en déduire la liste des personnes que l'on veut extraire de la table 0, et ce, sur le même principe.

    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
     
    WITH ListTb1 AS (
    SELECT idClient
      FROM table1
     WHERE NOT EXISTS ( SELECT NULL
                          FROM table2
                         WHERE table1.idClient = table2.idClient ) )
     
     
    SELECT *
      FROM table0
     WHERE NOT EXISTS ( SELECT NULL
                          FROM ListTb1
                         WHERE table0.idClient = ListTb1.idClient ) --L'erreur était ici, elle est corrigée

    Et donc, là, nous récupéront les informations de la table 0 en fonction des personnes présentes dans la table 1 mais qui ne sont pas dans la table 2.

    Edit : On pourrait aussi passer par des fonctions comme EXECPT ou MINUS il me semble.

    Cordialement,
    Lyche

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 28
    Points : 26
    Points
    26
    Par défaut transact sql
    Bonjour Lych,

    Merci pour ta réponse, pourtant le test ma donné le msg d'erreur suivant:

    "la table table1.idClient ne peut pas être lié"
    "la table table2.idClient ne peut pas être lié"

    l'erreur est engendré au moment de la selection à partir de la table0

    Merci de ton retour

  4. #4
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par spootnic22 Voir le message
    Bonjour Lych,

    Merci pour ta réponse, pourtant le test ma donné le msg d'erreur suivant:

    "la table table1.idClient ne peut pas être lié"
    "la table table2.idClient ne peut pas être lié"

    l'erreur est engendré au moment de la selection à partir de la table0

    Merci de ton retour
    Oui, c'est une erreur de ma part dans la dernière requête. Je corrige ça immédiatement.

    Cependant, en vous penchant un peu sur la question, il est assez aisé de trouver la source de l'erreur

    Cordialement,
    Lyche

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Ou plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT *
      FROM table0 as t0
     WHERE     EXISTS ( SELECT NULL
                          FROM table1 as t1
                         WHERE t1.idClient = t0.idClient )
       AND NOT EXISTS ( SELECT NULL
                          FROM table2 as t2
                         WHERE t2.idClient = t0.idClient );
    La requête avec le EXCEPT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
      FROM table0
     WHERE idClient IN ( SELECT idClient FROM table1
                         EXCEPT 
                         SELECT idClient FROM table2 );

  6. #6
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 28
    Points : 26
    Points
    26
    Par défaut
    super!
    un très grand merci Lych.

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT		ZERO.*
    FROM		dbo.table0 AS ZERO
    INNER JOIN	dbo.table1 AS UN
    			ON ZERO.idClient = UN.idClient
    LEFT JOIN	dbo.table2 AS DEUX
    			ON DEUX.idClient = ZERO.idClient
    WHERE		DEUX.idClient IS NULL
    @++

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    @elsuket, s'il y a une cardinalité (1,n) entre table0 et table1, ça va générer des doublons.
    Il faut rajouter un distinct dans la requête.

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

Discussions similaires

  1. Réduction du Journal de transactions SQL Server
    Par Aki dans le forum Bases de données
    Réponses: 1
    Dernier message: 08/10/2004, 09h15
  2. [JDBC][Access] Transaction SQL sur MS Access?
    Par Twofy dans le forum JDBC
    Réponses: 2
    Dernier message: 19/08/2004, 14h46
  3. Transact Sql : Conversion de variable
    Par lord_paco dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/08/2003, 13h25
  4. Conversion de SQL à Transact-SQL
    Par sebioni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/07/2003, 11h59
  5. - fonction Transact-SQL...
    Par korrigann dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/05/2003, 15h00

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