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 :

requête sql un peu complexe


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    988
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 988
    Par défaut requête sql un peu complexe
    bonjour,

    Voici une requête sql un peu difficile à comprendre, car je ne comprends pas la clause When et les différentes jointures, du fait que j'ai appris sql sous Oracle.

    Pouvez vous m'aider à la comprendre.

    Je ne comprends pas le signe >= de la clause When.

    Merci beaucoup à vous, car je bute sur cette requête depuis quelque temps sans en comprendre le sens vraiment.

    Bien cordialement.

    Nathalie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT     dbo.MICROTHESAURUS.ID_TERME_SOURCE,          dbo.TERMES.Lib_TERME,
     CASE WHEN ISNULL(d .id_micro_thesaurus, 0) >= microthesaurus.id_micro_thesaurus THEN ISNULL(d .id_micro_thesaurus, 0) 
    ELSE microthesaurus.id_micro_thesaurus END AS id_micro_thesaurus,
    
     dbo.GENERIQUES.ID_TERME_GENERIQUE, dbo.MICROTHESAURUS.ID_MICRO_THESAURUS AS bad_id_microthesaurus, 
     dbo.MICROTHESAURUS.ID_THES
    FROM         dbo.MICROTHESAURUS INNER JOIN dbo.TERMES ON dbo.MICROTHESAURUS.ID_TERME_SOURCE = dbo.TERMES.ID_TERME 
    				INNER JOIN dbo.GENERIQUES ON dbo.GENERIQUES.ID_TERME_SOURCE_G = dbo.TERMES.ID_TERME 
    				LEFT OUTER JOIN dbo.MICROTHESAURUS d ON d .ID_TERME_SOURCE = dbo.GENERIQUES.ID_TERME_GENERIQUE
    J'ai besoin que cette requête exprime que s'il y a une correspondance avec la table MICROTHESAURUs alors id_micro_thesaurus a une valeur, sinon, la valeur de id_micro_thesaurs est 'NULL'

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    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 997
    Billets dans le blog
    6
    Par défaut
    La voici récrite plus proprement en indentant et en utilisant des alias.

    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
    SELECT M.ID_TERME_SOURCE,          
           T.Lib_TERME,
           CASE 
              WHEN COALESCE(d.id_micro_thesaurus, 0) >= M.id_micro_thesaurus 
                   THEN COALESCE(d.id_micro_thesaurus, 0) 
              ELSE M.id_micro_thesaurus 
           END AS id_micro_thesaurus,
           G.ID_TERME_GENERIQUE, 
           M.ID_MICRO_THESAURUS AS bad_id_microthesaurus, 
           M.ID_THES
     
    FROM   dbo.MICROTHESAURUS AS M
           INNER JOIN dbo.TERMES AS T
                 ON M.ID_TERME_SOURCE = T.ID_TERME 
           INNER JOIN dbo.GENERIQUES AS G
                 ON G.ID_TERME_SOURCE_G = T.ID_TERME 
           LEFT OUTER JOIN dbo.MICROTHESAURUS d 
                 ON d.ID_TERME_SOURCE = GS.ID_TERME_GENERIQUE
    j'ai appris sql sous Oracle.
    Hélas Oracle propose un langage SQL propre à lui seul et bien éloigné de la norme, alors que SQL Server est plutôt proche de la norme SQL. C'est pourquoi il est préférable d'apprendre le SQL que le dialecte d'un SGBDR. Mes bouquins, comme mon site web peuvent vous y aider !

    Le CASE est décrit à cette page :
    http://sqlpro.developpez.com/cours/sqlaz/select/#L7
    Le COALESCE (ou ISNULL propre à SQL Server) est décrit ici :
    http://sqlpro.developpez.com/cours/sqlaz/select/#L5.2

    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/ * * * * *

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    988
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 988
    Par défaut requête un peu complexe
    Bonjour,

    Je vous remercie beaucoup de votre aide.
    Il y a une partie de la requête que je ne comprends pas bien, même après avoir lu les différentes sections de votre cours à ce sujet.
    voici cette partie de requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     CASE 
              WHEN COALESCE(d.id_micro_thesaurus, 0) >= M.id_micro_thesaurus 
                   THEN COALESCE(d.id_micro_thesaurus, 0) 
              ELSE M.id_micro_thesaurus 
           END AS id_micro_thesaurus
    Que signifie ici le signe >=, qu'est ce qui est testé ici exactement.

    Merci encore de votre aide.

    Cordialement.

    Nathalie Harbonne

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Le symbole ">=" est un opérateur de comparaison supérieur ou égal.
    Il permet de comparer des valeurs.

  5. #5
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    CASE
    WHEN COALESCE(d.id_micro_thesaurus, 0) >= M.id_micro_thesaurus
    THEN COALESCE(d.id_micro_thesaurus, 0)
    ELSE M.id_micro_thesaurus
    END AS id_micro_thesaurus
    signifie:

    si d.id_micro_thesaurus est null ET M.id_micro_thesaurus est inferieur a 0 alors id_micro_thesaurus=0
    si d.id_micro_thesaurus n'est pas null ET d.id_micro_thesaurus est superieur ou egal a M.id_micro_thesaurus alors id_micro_thesaurus=d.id_micro_thesaurus
    dans tous les autres cas id_micro_thesaurus=M.id_micro_thesaurus

Discussions similaires

  1. [PDO] comptage des lignes retournées par une requête SELECT un peu complexe
    Par laurentSc dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/02/2015, 21h37
  2. Requête SQL un peu folle !
    Par bronon dans le forum Requêtes
    Réponses: 0
    Dernier message: 03/01/2014, 22h15
  3. Requête SQL un peu tordue
    Par jkofr dans le forum SQL
    Réponses: 40
    Dernier message: 12/10/2011, 16h33
  4. erreur requète SQL : trop peu de paramètres
    Par pierre.egaud dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 21/04/2006, 14h57
  5. requête SQL un peu casse tête
    Par hellbilly dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/12/2005, 10h03

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