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 :

Requête d'insertion conditionnelle


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2011
    Messages : 89
    Points : 62
    Points
    62
    Par défaut Requête d'insertion conditionnelle
    Bonjour, je me tourne vers vous car j'ai un souci que je n'arrive pas à résoudre (peut etre que de l'expliquer me permettra de mieux le comprendre moi-meme)

    J'ai une table A qui contient :
    colonnes : CodeEmployé, NomAppli, Répertoires
    données exemples:
    01; AlPhaY; y01,y02y z03
    02; AlphaY; m01
    03; AlphaY; y03,b06,y02

    Je voudrais inserer dans la table B:
    01; AlphaY; y01
    01; AlphaY; y02y
    03; AlphaY; y02
    03; AlphaY; y02

    (en gros une ligne par repertoire commencant par y0 et associé à l'appli associé à alphaY)

    le probleme c'est que je ne vois meme pas d'algorythme de resolution, donc j'ai meme pas un bout de code qui marche à proposer...

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

    Les solutions vont pas mal dépendre de votre SGBD, mais vous ne l'avez pas précisé...

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Deux questions avant d'étudier une réponse possible :
    • Quel SGBD utilises-tu ? (et sa version)
    • Le nombre de valeurs dans la colonne Répertoires est-il limité ?

    Question complémentaire :
    Quelle(s) requête(s) as-tu déjà essayée(s) ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2011
    Messages : 89
    Points : 62
    Points
    62
    Par défaut
    Déjà : merci de vos réponses.

    Je suis sur un serveur en SQL Server et j'utilise une interface qui donne un script qui fait un croisement entre le vb.net et le SQL.

    Mais la partie qui m'interesse est en SQL. C'est pourquoi je souhaiterai une aide en sql normalisé et non pas forcement adapté au langage utilisé pour mon code

    oui le nombre de valeur dans répertoire est illimité ou presque (pour ceux qui connaissent Active Directory il s'agit du champ memberof ramené à 4000 caractères, si les 4000 caracteres sont dépassés une nouvelle ligne est créé automatiquement dans la base dans une table A2 (dite debordement) mais ca je saurais faire une fois que j'aurais recupere les donnees de A)

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2011
    Messages : 89
    Points : 62
    Points
    62
    Par défaut
    Ayant trouvé la solution partielle a mon problème je la poste ici pour ceux qui seraient confronté au meme probleme que moi. Maintenant a moi d'adapter :


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

    Requete :
    ------------------------
    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
    30
    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
    Résultats :
    -------------------------
    idPers Role
    ----------- --------------------------------------------------
    1 RespX
    1 RespY
    2 Admin
    3 RespX
    3 respY
    3 RespZ

    (6 ligne(s) affectée(s))

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

    Votre requête récursive pourrait devenir poussive quand le nombre de lignes va augmenter.

    Voici une alternative à base d'XML à tester :

    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
     
     
    ;
    WITH CTE AS (
    	SELECT 
    			idPers, 
    			CAST(
    				'<c>' 
    				+ REPLACE(
    					Role, 
    					',', 
    					'</c><c>'
    				) 
    				+ '</c>' 
    			AS XML) AS Roles
    	FROM TRolePers
    )
    SELECT 
    	idPers,
    	LTRIM(c.value('.', 'VARCHAR(50)')) as Role
    FROM cte
    CROSS APPLY Roles.nodes('./c') T(c)
    ORDER BY 1,2

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

Discussions similaires

  1. Requête INSERT conditionnelle
    Par dominos dans le forum Requêtes
    Réponses: 6
    Dernier message: 02/09/2014, 17h11
  2. Requête d'insertion dans une base ACCESS
    Par kurul1 dans le forum C++Builder
    Réponses: 5
    Dernier message: 02/11/2006, 17h41
  3. [Requête] Problème INSERT INTO
    Par lerico dans le forum Requêtes et SQL.
    Réponses: 22
    Dernier message: 10/01/2006, 17h12
  4. Optimisation d'une requête d'insertion
    Par fdraven dans le forum Oracle
    Réponses: 15
    Dernier message: 01/12/2005, 14h00
  5. Requête d'insertion multiple avec 1 valeur fixe
    Par [DreaMs] dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/12/2005, 09h28

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