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 :

Dupliquer une ligne et changer une valeur SI condition


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2021
    Messages : 6
    Par défaut Dupliquer une ligne et changer une valeur SI condition
    Bonjour à tous et merci d'avance à ceux qui prendront de leur temps précieux pour me répondre
    J'ai une table
    ID Fiche Nom Ordre
    1 FT-1 Tableau Pricipal 1
    2 FT-1 Tableau Secondaire 2
    3 FT-2 Tableau Pricipal 1
    4 FT-3 Tableau Pricipal 1
    5 FT-3 Tableau Secondaire 2
    6 FT-4 Tableau Pricipal 1
    7 FT-5 Tableau Pricipal 1
    8 FT-5 Tableau Secondaire 2
    J'ai 10 000 lignes
    Comme vous le voyez, certaines Fiches ont 2 Tableaux et d'autres 1 Tableau
    J'aimerais que chaque fiche aille 2 Tableaux…
    Les tableaux ont toujours les mêmes noms et le même numéro d'ordre !
    J'ai essayé de bidouiller des codes trouvés sur le forum, mais aucun ne fonctionne
    Quelqu'un aurait une solution pour moi, s'il vous plaît ???
    Merci
    C-ba

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 176
    Par défaut
    Bonjour,

    Quelle est ta BDD? Ce genre de besoin est facile à faire sous Oracle avec la jointure externe partitionnée:

    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
    select t.id, t.fiche, v.nom, v.ordre
    from t
    partition by (t.fiche)
    right join (select 'Tableau Pricipal' as nom, 1 as ordre from dual
                union all
                select 'Tableau Secondaire', 2 from dual
              ) v
    on (t.nom = v.nom)   ;
     
    ID	FICHE	NOM	        ORDRE
    1	FT-1	Tableau Pricipal	1
    2	FT-1	Tableau Secondaire	2
    3	FT-2	Tableau Pricipal	1
     - 	FT-2	Tableau Secondaire	2
    4	FT-3	Tableau Pricipal	1
    5	FT-3	Tableau Secondaire	2
    6	FT-4	Tableau Pricipal	1
     - 	FT-4	Tableau Secondaire	2
    7	FT-5	Tableau Pricipal	1
    8	FT-5	Tableau Secondaire	2

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2021
    Messages : 6
    Par défaut
    Bonjour et merci de ta réponse,
    Je suis sur SQL Server 2014...

    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    Quelle est ta BDD? Ce genre de besoin est facile à faire sous Oracle avec la jointure externe partitionnée:

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2021
    Messages : 6
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select t.id, t.fiche, v.nom, v.ordre
    from t
    partition by (t.fiche)
    right join (select 'Tableau Pricipal' as nom, 1 as ordre from dual
                union all
                select 'Tableau Secondaire', 2 from dual
              ) v
    on (t.nom = v.nom)   ;
    J'essaye de traduire ça en SQL mais bô... je sèche ...

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 624
    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 624
    Billets dans le blog
    10
    Par défaut
    Solution applicable avec n'importe quel SGBD :


    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
    15
    16
    17
    18
    select T1.ID
         , T1.Fiche
         , T1.Nom
         , T1.Ordre
    from T1  as T1
    where T1.Ordre=1
    union all
    select coalesce(L1.ID, 0)
         , T1.Fiche
         , 'Tableau secondaire'
         , 2
    from T1  as T1  
    left join T1 as L1  
       on L1.Fiche=T1.Fiche
      and L1.Ordre=2
    where T1.Ordre=1
    order by T1.Fiche
           , T1.Ordre


    Résultat :

    ID Fiche Nom Ordre
    1 FT-1 Tableau Principal 1
    2 FT-1 Tableau secondaire 2
    3 FT-2 Tableau Principal 1
    0 FT-2 Tableau secondaire 2
    4 FT-3 Tableau Principal 1
    5 FT-3 Tableau secondaire 2
    6 FT-4 Tableau Principal 1
    0 FT-4 Tableau secondaire 2
    7 FT-5 Tableau Principal 1
    8 FT-5 Tableau secondaire 2


    Les identifiants de valeur 0 permettent de reconnaître les lignes ajoutées.
    Si l'on préfère conserver l'identifiant de la ligne principale, il faut remplacer coalesce(L1.ID, 0) par coalesce(L1.ID,T1.ID)

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 176
    Par défaut
    Avec Oracle, une seule lecture de la table, les autres SGBD, 3 lectures!

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Avec Oracle, une seule lecture de la table, les autres SGBD, 3 lectures!
    ça ne veut rien dire.. C'est le nombre d'IO qui compte ainsi que le temps de réponse... Sachant que SQL Server fait du parallélisme automatiquement et implémente des techniques d'accès autres que celles d'Oracle...

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

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2021
    Messages : 6
    Par défaut
    Bonjour à tous,
    Merci @escartefigue en adaptant légèrement ça fonctionne,
    J'ai bien une vue de la table corrigée c'est magnifique, mais...
    En fait je voudrais ça mais avec des Insert si le tableau secondaire n'existe pas et que si il insert un tableau secondaire l'ID prenne le N° suivant disponible...
    Je sais que j'abuse mais c'est pourquoi je me tourne vers des experts...
    Mon prof de SQL m'a dit que ce n'était pas possible mais je n'y crois pas...
    Merci d'avance à ceux qui prendront le temps de m'aider...


    Citation Envoyé par escartefigue Voir le message
    Solution applicable avec n'importe quel SGBD :

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Bonjour,

    Si la colonne ID est de type identifiant auto-incrémenté, c'est très simple :
    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
    insert into matable
        (   Fiche
        ,   Nom
        ,   Ordre
        )
    select  T1.Fiche    
         ,  'Tableau secondaire'
         ,  2
    from    matable  as T1  
    where   T1.Ordre = 1
        and not exists
            (   select  null
                from    T1 as L1  
                where   L1.Fiche = T1.Fiche
                    and L1.Ordre = 2
            )
    ;
    Sinon, c'est un peu plus complexe mais pas inatteignable :
    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
    insert into matable
        (   ID
        ,   Fiche
        ,   Nom
        ,   Ordre
        )
    select  rank(T1.ID) over (order by T1.ID) + T2.Max_ID
        ,   T1.Fiche    
         ,  'Tableau secondaire'
         ,  2
    from    matable as T1
        cross join
            (   select  max(ID) as Max_ID
                from    matable
            )   as  T2
    where   T1.Ordre = 1
        and not exists
            (   select  null
                from    matable as L1  
                where   L1.Fiche = T1.Fiche
                    and L1.Ordre = 2
            )
    ;
    Valable uniquement si on est certain d'être seul à ajouter des lignes sur la table à ce moment
    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.

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

Discussions similaires

  1. dupliquer une valeur d'un tableau avec un pas différent de 1
    Par mina2790 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 24/11/2019, 10h48
  2. Remplacer le contenu d'une cellule par une valeur sous condition
    Par zoocoral dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/11/2015, 06h50
  3. [AC-2007] Etats ACCESS, affichage d'une valeur sous condition
    Par Maryy dans le forum IHM
    Réponses: 3
    Dernier message: 13/01/2012, 09h35
  4. [AC-2003] Récup d'une valeur sous condition
    Par louzz dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 07/11/2011, 10h39
  5. Dupliquer une valeur.
    Par Shandler dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 28/02/2008, 11h59

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