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

SQL Oracle Discussion :

MERGE avec CTE [11gR2]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut MERGE avec CTE
    Bonjour,

    Après de longues années sans toucher à Oracle, je renoue avec difficulté.

    Je travaille sur des requêtes de reprises de données pour une migration.

    J'ai une table de tiers (TIE) donc la clé, pour faire simple est "SIGTIE".
    Cette clé est un VARCHAR2(12) et je doit l'exporter dans un format F + 8 caractères.

    Pour effectuer cette codification, sur laquelle le client peut prendre la main (forcer le code de certaines lignes), je souhaite donc alimenter une colonne (CODZN10).

    Un grand nombre de lignes a déjà pour code un numéro sur 8 chiffres. Pour ceux là, je souhaite simplement ajouter le préfixe "F".
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update tie set codzn10 = 'F' || sigtie where codsoc = 1 and typtie = 'FOU' and length(sigtie) = 8 and REGEXP_LIKE(sigtie,'^(\d*)$','i');

    Pour les autres, l'idée est :
    1 : récupérer la plus grande valeur numérique déjà stockée dans CODZN10 (en supprimant le préfixe)
    2 : attribuer un numéro à arbitraire à toutes les lignes de TIE qui n'en ont pas déjà un
    3 : mettre à jour CODZN10 de toutes ces lignes trouvées avec le résultat du 1 + le numéro d'ordre du 2

    Ce qui donnait dans ma tête :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    with lastnum (num)
    as
    (
        select case max(codzn10) when ' ' then 0 else to_number(substr(max(codzn10), 2)) end
        from tie
        where codsoc = 1
        and typtie = 'FOU'
        and (length(sigtie) <> 8 or not(REGEXP_LIKE(sigtie,'^(\d*)$','i')))
        and codzn10 = ' '
    ),
    numord (sigtie, num)
    as
    (
        select tie.sigtie, lastnum.num + rownum
        from tie
        cross join lastnum
        where tie.codsoc = 1
        and tie.typtie = 'FOU'
        and (length(sigtie) <> 8 or not(REGEXP_LIKE(sigtie,'^(\d*)$','i')))
        and codzn10 = ' '
    )
    merge into tie
    using numord
    on (tie.sigtie = numord.sigtie)
    when matched then update set tie.codzn10 = numord.num
    where 
        tie.codsoc = 1 
    and tie.typtie = 'FOU' 
    and (length(sigtie) <> 8 or not(REGEXP_LIKE(sigtie,'^(\d*)$','i')))
    and codzn10 = ' ';
    Sauf que j'ai une erreur de syntaxe sur le "MERGE", avec "SELECT attendu".

    MERGE n'est pas compatible avec les CTE ?
    Il y a une syntaxe particulière ?

    Version d'oracle :
    Oracle Database 11g Release 11.2.0.2.0 - 64bit Production
    PL/SQL Release 11.2.0.2.0 - Production
    "CORE 11.2.0.2.0 Production"
    TNS for Linux: Version 11.2.0.2.0 - Production
    NLSRTL Version 11.2.0.2.0 - Production

  2. #2
    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
    Comme ça :
    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
    merge into tie
    using   (   with lastnum (num)
                as  (   select  case max(codzn10) when ' ' then 0 else to_number(substr(max(codzn10), 2)) end
                        from    tie
                        where   codsoc = 1
                            and typtie = 'FOU'
                            and (length(sigtie) <> 8 or not(REGEXP_LIKE(sigtie,'^(\d*)$','i')))
                            and codzn10 = ' '
                    )
                select  tie.sigtie
                   ,    lastnum.num + rownum  as num
                from    tie
                    cross join
                        lastnum
                where   tie.codsoc = 1
                    and tie.typtie = 'FOU'
                    and (length(sigtie) <> 8 or not(REGEXP_LIKE(sigtie,'^(\d*)$','i')))
                    and codzn10 = ' '
            )  numord
        on  (tie.sigtie = numord.sigtie)
    when matched then 
        update
            set tie.codzn10 = numord.num
        where   tie.codsoc = 1 
            and tie.typtie = 'FOU' 
            and (length(sigtie) <> 8 or not(REGEXP_LIKE(sigtie,'^(\d*)$','i')))
            and codzn10 = ' '
    ;
    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.

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Arf, merci.

    Le pire c'est que j'ai pensé à cette syntaxe, et je me suis dit "bof, à tous les coups ça va pas marcher, je vais plutôt poser la question"

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Merci, après tests ça marche nickel

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

Discussions similaires

  1. Vue avec CTE
    Par PickEpique dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/01/2008, 11h58
  2. Merge avec un probleme d'index
    Par Flipmode dans le forum SQL
    Réponses: 3
    Dernier message: 19/06/2007, 15h14
  3. Merge avec deux vector, sans doublons ?
    Par b Oo dans le forum SL & STL
    Réponses: 8
    Dernier message: 06/11/2006, 23h00
  4. Réponses: 11
    Dernier message: 27/04/2006, 15h03
  5. Merge avec variables
    Par kluh dans le forum Oracle
    Réponses: 18
    Dernier message: 25/07/2005, 14h31

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