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

Requêtes MySQL Discussion :

Requête permettant une MAJ de données


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien ERP
    Inscrit en
    Mars 2014
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien ERP

    Informations forums :
    Inscription : Mars 2014
    Messages : 106
    Points : 91
    Points
    91
    Par défaut Requête permettant une MAJ de données
    Bonjour à tous,

    Voila une semaine que je me casse les dents sur une requête. Je vais essayer de m'expliquer.

    Dans ma BD, j'ai une table indiquant ou des articles devraient être stocké (en vue d'un verrouillage de positionnement des articles)
    table art stock (table ou les stocks sont attendus)
    structure de la table :
    Article Emplacement
    ref1 Lieu1
    ref1 Lieu2
    ref1 Lieu3
    ref1 Lieu4
    ref2 Lieu1
    ref2 Lieu5

    Un article peut avoir plusieurs emplacement et un emplacement peut comporter plusieurs articles (des lieux temporaires de 2 types ont été utilises 'S' et 'A definir')

    une seconde table comportant les stock réels
    artlieu (si un article n'a plus de stock, il n'apparait plus dans la table)
    structure de la table
    Article Emplacement Quantite
    ref1 Lieu1 X1
    ref1 LieuA X2
    ref1 LieuB X3
    ref2 Lieu1 X4
    ref2 LieuC X5

    Aujourd'hui, un article (de la table artlieu) n'a pas forcement son stock théorique (dans la table artstock)

    Je voudrais :
    Mettre a jour la table art stock avec les emplacements de la table art lieu et supprimer les emplacement temporaires qui n'ont pas de stock ('A_DEFINIR' ou 'S' ) qui ont été utilise dans la table artstock.

    Avant les delete, insert ou update, je cherche déjà a récupérer les données par un select mais n'y parviens pas (jointure interne, externe, exists, in, ...)
    Je ne parviens pas a créer une requête qui me donnerai un résultat du type

    Article EmplacementArtstock EmplacementArtlieu Quantite
    ref1 Lieu1 Lieu1 X1
    ref1 Lieu2 Null Null
    ref1 Lieu3 Null Null
    ref1 Lieu4 Null Null
    ref1 Null LieuA X2
    ref1 Null LieuB X3
    ref2 Lieu1 Lieu1 X4
    ref2 Lieu5 Null Null
    ref2 Null LieuC X5

    Puis depuis cette requête supprimer le ligne ou EmplacementArtstock = (A_DEFINIR ou S) si Quantite est null
    et d'insérer EmplacementArtlieu si EmplacementArtstock est null

    Je pense devoir passer par plusieurs étapes mais ne vois pas trop.

    Quelqu'un aurait une idée ?

    Merci de votre aide et je reste bien sur a votre disposition pour plus d'explications.

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Des idées oui ...

    artstock s
    s.article s.emplacement
    ref1 Lieu1
    ref1 Lieu2
    ref1 Lieu3
    ref1 Lieu4
    ref2 Lieu1
    ref2 Lieu5

    artlieu l
    l.article l.emplacement l.quantite
    ref1 Lieu1 X1
    ref1 LieuA X2
    ref1 LieuB X3
    ref2 Lieu1 X4
    ref2 LieuC X5
    je propose de regarder ces requêtes, que je n'ai pas testé ...
    à corriger au besoin ...

    1) Je veux tout ce qui est dans artstock et pas dans artlieu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select s.article, s.emplacement, l.emplacement, l.quantite
    from artstock l left join artlieu l
    on s.article = l.article
        AND s.emplacement = l.emplacement
    Résultat normalement
    =>
    s.article s.emplacement l.emplacement l.quantite
    ref1 Lieu1 Lieu1 X1
    ref1 Lieu2 Null Null
    ref1 Lieu3 Null Null
    ref1 Lieu4 Null Null
    ref2 Lieu1 Lieu1 X4
    ref2 Lieu5 Null Null

    On voit que ces lignes "ref1 Lieu1 Lieu1 X1" et "ref2 Lieu1 Lieu1 X4"
    où rien ne doit se passer/qui ne doivent pas être touchées apparaissent ici pour les écarter de notre traitement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select s.article, s.emplacement
    from artstock l left join artlieu l
    on s.article = l.article
        AND s.emplacement = l.emplacement
    where l.emplacement is null
    Résultat normalement
    =>
    s.article s.emplacement
    ref1 Lieu2
    ref1 Lieu3
    ref1 Lieu4
    ref2 Lieu5

    2) Je veux tout ce qui est dans artlieu et pas dans artstock

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select l.article, s.emplacement, l.emplacement, l.quantite
    from artstock l right join artlieu l
    on s.article = l.article
        AND s.emplacement = l.emplacement
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select l.Article, s.emplacement, l.emplacement, l.quantite
    from artlieu l left join artstock  s
    on s.article = l.article
        AND s.emplacement = l.emplacement
    Résultat normalement
    =>
    l.article s.emplacement l.emplacement l.quantite
    ref1 Lieu1 Lieu1 X1
    ref1 Null LieuA X2
    ref1 Null LieuB X3
    ref2 Lieu1 Lieu1 X4
    ref2 Null LieuC X5

    On voit que ces lignes "ref1 Lieu1 Lieu1 X1" et "ref2 Lieu1 Lieu1 X4"
    où rien ne doit se passer/qui ne doivent pas être touchées apparaissent ici pour les écarter de notre traitement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select l.article, s.emplacement, l.emplacement, l.quantite
    from artstock l right join artlieu l
    on s.article = l.article
        AND s.emplacement = l.emplacement
    where s.emplacement is null
    Résultat normalement
    =>
    l.article l.emplacement l.quantite
    ref1 LieuA X2
    ref1 LieuB X3
    ref2 LieuC X5

    ouf ...
    Est ce que ça te parle un peu plus ?
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien ERP
    Inscrit en
    Mars 2014
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien ERP

    Informations forums :
    Inscription : Mars 2014
    Messages : 106
    Points : 91
    Points
    91
    Par défaut
    Bonjour vttman,

    La j'en perds mon latin. J'étais passe par ces requêtes mais je ne comprends pas le soucis.
    Il me comblait les null par des lignes supplémentaires avec toutes les combinaisons possibles.

    J'ai testé ta (première) requête qui fonctionne nickel puis comparé à celle que j'avais faite, mis mes conditions en commentaires : nickel sans conditions, retiré mes instructions de commentaires et la miracle ca marche...

    je continue merci pour ce coup de pouce

  4. #4
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Sinon Timkeeper
    Donne ta requête qui ramenait trop de lignes
    pour comprendre d'où venait l'erreur ...
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  5. #5
    Membre régulier
    Homme Profil pro
    Technicien ERP
    Inscrit en
    Mars 2014
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien ERP

    Informations forums :
    Inscription : Mars 2014
    Messages : 106
    Points : 91
    Points
    91
    Par défaut
    C'etait celle la :

    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
    select
            artstock_disp.ARTICLE,
            artstock_disp.DISPONIBILITE,
            artlieu.DISPONIBILITE,
            artlieu.QTE_STOCK
    from
            artstock_disp
            LEFT OUTER JOIN artlieu
            ON artstock_disp.ARTICLE = artlieu.ARTICLE AND artstock_disp.DISPONIBILITE = artlieu.DISPONIBILITE
     
     
    -- where
    --         artstock_disp.ARTICLE = '8417463'
    --         AND
    --         artlieu.QTE_STOCK is null
    --         AND
    --         artstock_disp.DISPONIBILITE = 'A_DEFINIR'
    Et elle a fonctionnée comme par magie
    dans ma condition j'ai juste un c

  6. #6
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Bon je ne vois pourtant rien d'anormal !? Etrange ...

    Si tu as d'autres soucis (insert/ delete) n'hésite pas à revenir
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut Timkeeper.

    Avec un exemple, cela sera plus parlant :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `artstock`
    --------------
     
    --------------
    CREATE TABLE `artstock`
    ( `id`           integer unsigned not null auto_increment primary key,
      `article`      char(10)         not null,
      `emplacement`  char(10)         not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `artstock` (`article`,`emplacement`) values
      ('Ref1','Lieu1'), ('Ref1','Lieu2'), ('Ref1','Lieu3'), ('Ref1','Lieu4'), ('Ref2','Lieu1'), ('Ref2','Lieu5')
    --------------
     
    --------------
    select * from artstock
    --------------
     
    +----+---------+-------------+
    | id | article | emplacement |
    +----+---------+-------------+
    |  1 | Ref1    | Lieu1       |
    |  2 | Ref1    | Lieu2       |
    |  3 | Ref1    | Lieu3       |
    |  4 | Ref1    | Lieu4       |
    |  5 | Ref2    | Lieu1       |
    |  6 | Ref2    | Lieu5       |
    +----+---------+-------------+
    --------------
    DROP TABLE IF EXISTS `artlieu`
    --------------
     
    --------------
    CREATE TABLE `artlieu`
    ( `id`           integer unsigned not null auto_increment primary key,
      `article`      char(10)         not null,
      `emplacement`  char(10)         not null,
      `quantite`     integer unsigned not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `artlieu` (`article`,`emplacement`,`quantite`) values
      ('Ref1','Lieu1',1), ('Ref1','LieuA',2), ('Ref1','LieuB',3), ('Ref2','Lieu1',4), ('Ref2','LieuC',5)
    --------------
     
    --------------
    select * from artlieu
    --------------
     
    +----+---------+-------------+----------+
    | id | article | emplacement | quantite |
    +----+---------+-------------+----------+
    |  1 | Ref1    | Lieu1       |        1 |
    |  2 | Ref1    | LieuA       |        2 |
    |  3 | Ref1    | LieuB       |        3 |
    |  4 | Ref2    | Lieu1       |        4 |
    |  5 | Ref2    | LieuC       |        5 |
    +----+---------+-------------+----------+
    --------------
    create table `sample` as
     
    select           s.article      as 'article',
                     s.emplacement  as 'stock_emplacement',
                     l.emplacement  as 'lieu_emplacement',
                     l.quantite     as 'quantite',
                     s.id           as 'ident_stock',
                     l.id           as 'ident_lieu'
     
               from  artstock as s
     
    left outer join  artlieu as l
                 on  l.article     = s.article
                and  l.emplacement = s.emplacement
     
    union
     
    select           l.article      as 'article',
                     s.emplacement  as 'stock_emplacement',
                     l.emplacement  as 'lieu_emplacement',
                     l.quantite     as 'quantite',
                     s.id           as 'ident_stock',
                     l.id           as 'ident_lieu'
     
               from  artlieu  as l
     
    left outer join  artstock as s
                 on  s.article     = l.article
                and  s.emplacement = l.emplacement
     
    order by article, stock_emplacement, lieu_emplacement
    --------------
     
    --------------
    select * from sample
    --------------
     
    +---------+-------------------+------------------+----------+-------------+------------+
    | article | stock_emplacement | lieu_emplacement | quantite | ident_stock | ident_lieu |
    +---------+-------------------+------------------+----------+-------------+------------+
    | Ref1    | NULL              | LieuA            |        2 |        NULL |          2 |
    | Ref1    | NULL              | LieuB            |        3 |        NULL |          3 |
    | Ref1    | Lieu1             | Lieu1            |        1 |           1 |          1 |
    | Ref1    | Lieu2             | NULL             |     NULL |           2 |       NULL |
    | Ref1    | Lieu3             | NULL             |     NULL |           3 |       NULL |
    | Ref1    | Lieu4             | NULL             |     NULL |           4 |       NULL |
    | Ref2    | NULL              | LieuC            |        5 |        NULL |          5 |
    | Ref2    | Lieu1             | Lieu1            |        4 |           5 |          4 |
    | Ref2    | Lieu5             | NULL             |     NULL |           6 |       NULL |
    +---------+-------------------+------------------+----------+-------------+------------+
    --------------
    select  *
      from  sample
     where  quantite is null
    --------------
     
    +---------+-------------------+------------------+----------+-------------+------------+
    | article | stock_emplacement | lieu_emplacement | quantite | ident_stock | ident_lieu |
    +---------+-------------------+------------------+----------+-------------+------------+
    | Ref1    | Lieu2             | NULL             |     NULL |           2 |       NULL |
    | Ref1    | Lieu3             | NULL             |     NULL |           3 |       NULL |
    | Ref1    | Lieu4             | NULL             |     NULL |           4 |       NULL |
    | Ref2    | Lieu5             | NULL             |     NULL |           6 |       NULL |
    +---------+-------------------+------------------+----------+-------------+------------+
    --------------
    delete t1 from `artstock` as t1
    inner     join `sample`   as t2
    on     t2.article           = t1.article
    and    t2.stock_emplacement = t1.emplacement
    where  t2.quantite is null
    --------------
     
    --------------
    select * from artstock
    --------------
     
    +----+---------+-------------+
    | id | article | emplacement |
    +----+---------+-------------+
    |  1 | Ref1    | Lieu1       |
    |  5 | Ref2    | Lieu1       |
    +----+---------+-------------+
    --------------
    select  *
      from  sample
     where  stock_emplacement is null
    --------------
     
    +---------+-------------------+------------------+----------+-------------+------------+
    | article | stock_emplacement | lieu_emplacement | quantite | ident_stock | ident_lieu |
    +---------+-------------------+------------------+----------+-------------+------------+
    | Ref1    | NULL              | LieuA            |        2 |        NULL |          2 |
    | Ref1    | NULL              | LieuB            |        3 |        NULL |          3 |
    | Ref2    | NULL              | LieuC            |        5 |        NULL |          5 |
    +---------+-------------------+------------------+----------+-------------+------------+
    --------------
    insert into `artstock` (`article`,`emplacement`)
    select  article,
            lieu_emplacement as emplacement
      from  sample
     where  stock_emplacement is null
    --------------
     
    --------------
    select * from artstock
    --------------
     
    +----+---------+-------------+
    | id | article | emplacement |
    +----+---------+-------------+
    |  1 | Ref1    | Lieu1       |
    |  5 | Ref2    | Lieu1       |
    |  7 | Ref1    | LieuA       |
    |  8 | Ref1    | LieuB       |
    |  9 | Ref2    | LieuC       |
    +----+---------+-------------+
    --------------
    alter table `artstock` drop column `id`
    --------------
     
    --------------
    alter table `artstock` add  column `id` integer unsigned auto_increment not null primary key first
    --------------
     
    --------------
    select * from artstock
    --------------
     
    +----+---------+-------------+
    | id | article | emplacement |
    +----+---------+-------------+
    |  1 | Ref1    | Lieu1       |
    |  2 | Ref2    | Lieu1       |
    |  3 | Ref1    | LieuA       |
    |  4 | Ref1    | LieuB       |
    |  5 | Ref2    | LieuC       |
    +----+---------+-------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. Requête pour une base de données
    Par clairetj dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/05/2011, 14h04
  2. [XSLT] Requête dans une base de données
    Par nicoboud2 dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 05/10/2009, 09h34
  3. Quelques requêtes sur une base de donnée
    Par Tomme dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/01/2008, 23h16
  4. [Lazarus] Problème de requête sur une base de données
    Par bubulemaster dans le forum Lazarus
    Réponses: 1
    Dernier message: 09/11/2007, 18h14
  5. Requête dans une base de données énorme
    Par Nanji dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/06/2006, 12h13

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