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 :

Récupérer un factoriel de ligne


Sujet :

MS SQL Server

  1. #1
    Inscrit Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Points : 283
    Points
    283
    Par défaut Récupérer un factoriel de ligne
    Bonjour,

    j'ai une table dont la structure est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TRolePers
    {
      idPers(int32)
      Role(varchar50)
    }
    Et comme vous vous en douter, les lignes contiennent ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1|RespX,RespY
    2|Admin
    3|RespX, RespZ
    etc...
    Est-il possible d'avoir une requête dont le résultat serait ceci sans passer par une table temporaire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1|RespX
    1|RespY
    2|Admin
    3|RespX
    3|RespZ
    merci

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    salut,

    si j'ai bien capté, avec les opérateurs ensemblistes tu peux faire ce que tu cherches.

    exemple, soit la table SYNC composée des colonnes syncSpid et syncProc contient deux lignes :

    57 procfullsync
    58 procquicksync


    en faisant la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select cast(syncSpid as varchar) from SYNC
    union
    select cast(syncProc as varchar) from SYNC;

    ça affiche :

    57
    58
    procfullsync
    procquicksync

    rem: je fais un cast sinon erreur à cause du type différent de mes colonnes...


    nico

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 917
    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 917
    Points : 51 693
    Points
    51 693
    Billets dans le blog
    6
    Par défaut
    Voici une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE TRolePers
    ( idPers int,
      Role   varchar(50))
     
    INSERT INTO TRolePers VALUES (1, 'RespX, RespY')
    INSERT INTO TRolePers VALUES (2, 'Admin')
    INSERT INTO TRolePers VALUES (3, 'RespX, RespZ, RespY')
    la requête :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    WITH T 
    AS
    (
    SELECT idPers, 
            CASE 
               WHEN CHARINDEX(',', Role) > 0 THEN LTRIM(SUBSTRING(Role, 1, CHARINDEX(',', Role) - 1))
               ELSE Role
            END AS UnRole, 
           LTRIM(SUBSTRING(Role, CHARINDEX(',', Role) + 1, LEN(Role) - CHARINDEX(',', Role))) AS LesAutresRoles
     
    FROM   TRolePers
    UNION ALL
    SELECT RP.idPers,
            CASE 
               WHEN CHARINDEX(',', LesAutresRoles) > 0 THEN LTRIM(SUBSTRING(LesAutresRoles, 1, CHARINDEX(',', LesAutresRoles) - 1))
               ELSE LesAutresRoles
            END, 
            CASE 
               WHEN CHARINDEX(',', LesAutresRoles) > 0 THEN LTRIM(SUBSTRING(LesAutresRoles, CHARINDEX(',', LesAutresRoles) + 1, LEN(LesAutresRoles) - CHARINDEX(',', LesAutresRoles)))
               ELSE NULL
            END
    FROM   TRolePers RP
           INNER JOIN T
                 ON T.idPers = RP.idPers
    WHERE LesAutresRoles IS NOT NULL
    )
    SELECT DISTINCT idPers, UnRole As Role
    FROM   T
    ORDER BY 1, 2
    Le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    idPers      Role
    ----------- --------------------------------------------------
    1           RespX
    1           RespY
    2           Admin
    3           RespX
    3           respY
    3           RespZ
     
    (6 ligne(s) affectée(s))
    Je vous invite à lire ce que j'ai écrit sur les CTE et la récursivité :
    http://sqlpro.developpez.com/cours/s...te-recursives/

    A +

  4. #4
    Inscrit Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Points : 283
    Points
    283
    Par défaut
    Bonjour,

    merci pour ta réponse sqlPro..

    C'est une syntaxe qui marche avec SQL server 2000 ? Parce que je dois t'avouer que je comprend pas tout...

    Je vais m'empresser d'aller lire ton tuto...

    Est-ce que cette façon de faire est couteuse en terme de perf ?

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par bilb0t Voir le message
    Bonjour,

    merci pour ta réponse sqlPro..

    C'est une syntaxe qui marche avec SQL server 2000 ? Parce que je dois t'avouer que je comprend pas tout...

    Je vais m'empresser d'aller lire ton tuto...

    Est-ce que cette façon de faire est couteuse en terme de perf ?
    les CTE, c'est une vrai révolution de sql serveur 2005, cela ouvre des perspectives remarquables. Cela n'existe malheureusement pas sous 2000.

    Je pense que les CTE sont plus optimisés que tout développement que tu pourrais envisager de développer pour obtenir le meme resultat.

  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 917
    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 917
    Points : 51 693
    Points
    51 693
    Billets dans le blog
    6
    Par défaut
    Non sous 2000, le seul moyen de résoudre votre requête est une procédure stockée récursive.

    Moralité si votre modèle de données respectait les règles élémentaires des bases de données relationnelles, c'est à dire une seule information par attribut (ou colonne), alors vous n'auriez pas ce genre de problème !
    Sans compter sur les performances lamentable que ce genre de mauvais modèle entraîne !

    A +

  7. #7
    Inscrit Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Points : 283
    Points
    283
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Non sous 2000, le seul moyen de résoudre votre requête est une procédure stockée récursive.

    Moralité si votre modèle de données respectait les règles élémentaires des bases de données relationnelles, c'est à dire une seule information par attribut (ou colonne), alors vous n'auriez pas ce genre de problème !
    Sans compter sur les performances lamentable que ce genre de mauvais modèle entraîne !

    A +
    Vous prêcher malheureusement (pour moi) un convertit...

    Je reprends une application dont le modele de donnée est completement absurde, débile, etc...

    Mais je dois assurer en parrallèle le refactoring et la maintenance donc je vais me trainer ce modele de donnée encore un peu de temps...

    Quoiqu'il en soit, un grand merci pour vos réponse et pour la doc très intéréssante.

  8. #8
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    c'est exactement ce que je souhaite faire mais quand j'utilise ta requete sous oracle il ne connait pas le charindex ??
    le SUBSTRING aussi, je l'ai remplacer par substr

    peut tu m'aider ?

    merci

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 917
    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 917
    Points : 51 693
    Points
    51 693
    Billets dans le blog
    6
    Par défaut
    Oracle respecte peu la norme SQL...

    A +

  10. #10
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    donc ce n'est pas possible ?

  11. #11
    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 : 43
    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
    Bonsoir,

    Bien sûr que si

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

Discussions similaires

  1. Récupérer un factoriel de ligne
    Par donny dans le forum PL/SQL
    Réponses: 13
    Dernier message: 20/10/2008, 22h39
  2. [VBA-E]récupérer le nom des lignes sélectionnées d'une listbox
    Par Ania dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 06/06/2006, 11h28
  3. Récupérer les N derniers lignes
    Par arsenik7 dans le forum Oracle
    Réponses: 8
    Dernier message: 12/05/2006, 13h35
  4. [javascript/dom] Récupérer le nombre de lignes d'un tableau
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/02/2006, 11h51
  5. Réponses: 2
    Dernier message: 25/10/2005, 10h51

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