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

Développement SQL Server Discussion :

[T-SQL] update avec incrémentation


Sujet :

Développement SQL Server

  1. #1
    Membre très actif Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 333
    Par défaut [T-SQL] update avec incrémentation
    Bonjour,
    Je dois dans le cadre d'une extraction de données d'une base A à une base B faire une requete qui donnerait

    tableA

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    item           Commande     Qty
    ------         --------------    --------- 
    1                 1                   20
    1                 1                   30
    1                 2                   200
    1                 2                   3
    1                 2                   10
    2                 17                 20
    3                 22                 1000
    3                 22                 2000
    tableB

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    item           Commande     Qty          Num_Ligne
    ------         --------------    ---------     -------------
    1                 1                   20              1
    1                 1                   30              2
    1                 2                   200            1
    1                 2                   3                2
    1                 2                   10              3
    2                 17                 20              1
    3                 22                 1000           1
    3                 22                 2000           2
    Une des idées que j'ai eu est
    ETAPE 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO TABLEB ( Item, Commande, Qty, Num_Ligne)
    (SELECT Item, Commande, Qty, 0 FROM TABLEA )
    ETAPE2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE TABLEB
    SET Num_Ligne = B2.Num_Ligne
    FROM TABLEB AS B1 INNER JOIN 
             (Select Item, Commande, (max(Num_Ligne) + 1) AS Num_Ligne
              FROM TABLEB
              GROUP BY Item, Commande) AS B2 
             ON  B1.Item=B2.Item AND B1.Commande=B2.Commande
    WHERE Num_Ligne = 0
    Ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    item           Commande     Qty          Num_Ligne
    ------         --------------    ---------     -------------
    1                 1                   20              1
    1                 1                   30              1
    1                 2                   200            1
    1                 2                   3                1
    1                 2                   10              1
    2                 17                 20              1
    3                 22                 1000           1
    3                 22                 2000           1
    Bon je me doute bien pourquoi cette méthode ne marche pas mais je vois pas du tout comment faire pour que ca marche... mis à part peut etre une procedure stockée avec un curseur.

    enfin je suis preneur de tout en 1, 2, 3 requetes s'il le faut
    Merci d'avance

    Loic

  2. #2
    Membre habitué Avatar de Ch0n
    Homme Profil pro
    Leader Technique .NET
    Inscrit en
    Mars 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 13
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    INSERT INTO TABLEB ( Item, Commande, Qty, Num_Ligne)
    SELECT 
    Item,
    Commande,
    Qty, 
    DENSE_RANK() over (PARTITION BY Item, Commande)
    FROM TABLEA
    Es ce que c'est pas cela que tu voudrais par hasard


  3. #3
    Membre très actif Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 333
    Par défaut
    Bonjour,
    Merci de ton aide.
    2 soucis ...
    1. il faut un order by dans la clause Dense_RANK
    ce qui donne pour le bete exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO TABLEB ( Item, Commande, Qty, Num_Ligne)
    SELECT 
    Item,
    Commande,
    Qty, 
    DENSE_RANK() over (PARTITION BY Item, Commande Order By Qty)
    FROM TABLEA
    2. Si tu as 2 quantités les même(dans l'exemple) elles vont avoir le meme numéro. ce qui est embetant dans ma vraie requete c'est que je n'ai à la base pas de champ dont je peux garantir qu'il sera toujours différent au sein d'un groupe (Item, Commande ). J'ai bien trouvé une solution mais je la trouve un peu(beaucoup) tordue. Il existe un RowID Global pour chaque table et donc je l'utilise dans l'order by

    ce qui donne en vrai
    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
    Select Convert(Varchar(80),SOQ.SOHNUM_0) AS ORDER_IDEN,
           Convert(Varchar(80),DENSE_RANK() over (PARTITION BY SOQ.SOHNUM_0,ITMM.ITMREF_0 ORDER BY SOQ.ROWID))  AS ROW_IDEN,
           Convert(Varchar(80),ITMM.ITMREF_0 + '/DSV') AS PLANNING_ENTITY_IDEN,
           Convert(Varchar(80),'DEFAULT') AS MARKET_IDEN, 
           Convert(Varchar(80),'BO') AS ROW_CLASS_IDEN, 
           Convert(Varchar(255),'Back Order') AS ROW_CLASS_DESCRIPTION,
           SO.DEMDLVDAT_0 AS AGREED_PERIOD, 
           SO.DEMDLVDAT_0 AS REQUEST_PERIOD,
           SO.DEMDLVDAT_0 + 9999 AS CANCEL_PERIOD,
           SOQ.QTYSTU_0 - SOQ.ODLQTYSTU_0 - DLVQTYSTU_0 AS QUANTITY,
           0 AS STATUS,
           0 AS PRIORITY/* compteur*/,
           0 AS LAYER,
           -1 AS MAX_RESIDUAL,
           -1 AS MIN_RESIDUAL,
           Convert(Varchar(80),NULL) AS ROUTING_IDEN,
    	   0 AS PLAN_RULE,
           NULL AS MAX_ANTICIPATION,
           1000000 AS CANCEL_COST
     
    FROM  BCV5TEST.ITMMASTER AS ITMM INNER JOIN 
          BCV5TEST.SORDERQ   AS SOQ ON ITMM.ITMREF_0 = SOQ.ITMREF_0 INNER JOIN
          BCV5TEST.SORDER    AS SO  ON SO.SOHNUM_0 = SOQ.SOHNUM_0 
    WHERE ITMM.XCATABC_0 <>4 AND
          SOQ.XQTYRESSTU_0 <> 0 AND
          SOQ.SOQSTA_0 <> 3
    Order by SOQ.SOHNUM_0,ITMM.ITMREF_0
    Enfin ca a l'air de marcher

    Juste par curiosité il y a t il d'autre moyen d'obtenir le meme résultat?

    En tout cas encore merci de ton aide

    Bonne soirée

    Loïc

  4. #4
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Juste par curiosité il y a t il d'autre moyen d'obtenir le meme résultat?
    Oui mais le 8ème jour dieu inventa DENSE_RANK() pour éviter de continuer à faire autrement

  5. #5
    Membre très actif Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 333
    Par défaut
    ok
    bon ben adjugé et résolu
    Merci à vous

    Loïc

  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
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Oui mais le 8ème jour dieu inventa DENSE_RANK() pour éviter de continuer à faire autrement
    ...et le 9eme jour, il s'est dit que peut être lbernard n'aurait pas envie de faire un tri inutile sur son rowID et a donc inventé ROW_NUMBER(), qui a priori sera plus performant

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ROW_NUMBER() OVER (PARTITION BY Item, Commande ORDER BY Item)

  7. #7
    Membre très actif Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 333
    Par défaut
    et le 10ème jour LBERNARD fier de son oeuvre se reposa
    Trève de plaisanterie c'est ca que je voulais exactement comme alternative j'aimais pas l'idée du ROWID

    c'est testé, adjugé, vendu
    Merci beaucoup

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

Discussions similaires

  1. Petit défi SQL (Update avec condition)
    Par Angeldu74 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 03/03/2009, 12h55
  2. Pb requete sql update avec jdbc
    Par nickyla dans le forum JDBC
    Réponses: 3
    Dernier message: 09/09/2008, 13h39
  3. Réponses: 4
    Dernier message: 26/09/2006, 18h28
  4. [SQL] update avec decode
    Par jojo22222 dans le forum Oracle
    Réponses: 8
    Dernier message: 04/01/2006, 17h50
  5. [PL/SQL] update avec jointure
    Par Fox_magic dans le forum Oracle
    Réponses: 6
    Dernier message: 09/12/2004, 12h19

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