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

MS SQL Server Discussion :

Problème de condition d'un update !


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 6
    Points
    6
    Par défaut Problème de condition d'un update !
    Bonjour,

    Je suis actuellement en train d'écrire une requete MSSQL pour mettre a jour une colonne d'une table répondant à une condition qui fonctionne très bien séparément sous forme d'un SELECT mais qui une fois mis en semble ne fonctionne pas correctement.

    Je m'explique:
    Ma requete classique affiche toutes les lignes d'une table commencent par HLS par exemple. Elle fonctionne bien avec la syntaxe suivante:
    SELECT ...
    FROM ...
    WHERE ...
    Tous s'affiche correctement.

    Maintenant je veux faire mon UPDATE:

    Je fais donc :
    UPDATE ...
    SET ...
    FROM ... le meme que celui de la requete précédente
    WHERE ... le meme que celui de la requete porécédente

    Conclusion:
    Ma requete fais bien le UPDATE, mais au lieu de mettre seulement les lignes concerné par le WHERE à jour elle mais toute la colonne à jour.

    Je ne comprend pas j'ai l'impression qu'elle ne prend pas en compte la condition puisqu'en résultat j'ai "1 row affected"!

    Pouvez-vous m'éclairer sur ce sujet. Je n'arrive pas a comprendre ce qui neconvient pas syntaxiquement à ma requete.

    Je peux également la copier si vous voulez mieux comprendre mon problème ou si je n'ai pas été suffisament clair.

    Merci pour vos réponses!

  2. #2
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Je ne suis pas certain de la tolérance de MSSQL aux syntaxes exotiques, mais il faudrait plutôt faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
    UPDATE table
    SET column1 = value 1, column2 = value2, ...
    WHERE condition
    UPDATE SET FROM WHERE n'est pas correct à priori.

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    OK mais dans ce cas la ou est ce que je peux définir les tables du FROM?

    Il faut bien que les conditions de ma requete puisse aller chercher les tables de chaque attribut. Si j'enlève l'étape du FROM dans ma requete. Comment ma requete va-t-elle faire pour faire le lien entre les attributs des tables et les tables elle même qu'elle utilise dans la condition WHERE?

  4. #4
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par Keihilin Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
    UPDATE table
    SET column1 = value 1, column2 = value2, ...
    WHERE condition
    ça aiderait peut être de voir ta requête complète...

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    Voila la requete qui liste ce dont j'ai besoins.

    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	
    ItemType_name,	
    AMOModel_name,
    AMOModelVariant_name,
    Item_version,
    D.Delivery_name
    FROM
    AMOModelVariant AMV,
    AMOModel AMM,	
    ItemParents IP,
    Item I,
    ItemType IT,
    ItemStatus IST,
    ItemDelivery ID,
    Delivery D
    WHERE
    AMM.Program_id = 2
    AND AMV.AMOModel_id=AMM.AMOModel_id
    AND AMV.AMOModelVariant_id = IP.Parent_id
    AND D.Delivery_id = ID.Delivery_id
    AND ID.Item_id = I.Item_id
    AND IP.ParentType_id = 11
    AND IP.Item_id = I.Item_id 
    AND I.ItemType_id = IT.ItemType_id
    AND I.ItemStatus_id = IST.ItemStatus_id
    AND AMM.AMOModel_name = 'HLS'
    AND D.Delivery_name LIKE 'HLS_AC%'
    VOila mon UPDATE qui bug:

    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
    UPDATE
    	AMOModelVariant 
    SET
    	AMOModelVariant_name = 'AC'
    FROM
    AMOModelVariant AMV,
    AMOModel AMM,	
    ItemParents IP,
    Item I,
    ItemType IT,
    ItemStatus IST,
    ItemDelivery ID,
    Delivery D
    WHERE
    AMM.Program_id = 2
    AND AMV.AMOModel_id=AMM.AMOModel_id
    AND AMV.AMOModelVariant_id = IP.Parent_id
    AND D.Delivery_id = ID.Delivery_id
    AND ID.Item_id = I.Item_id
    AND IP.ParentType_id = 11
    AND IP.Item_id = I.Item_id 
    AND I.ItemType_id = IT.ItemType_id
    AND I.ItemStatus_id = IST.ItemStatus_id
    AND AMM.AMOModel_name = 'HLS'
    AND D.Delivery_name LIKE 'HLS_AC%'
    Et voila ce que je viens de faire mais qui marche toujours pas:

    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
    UPDATE
    	AMOModelVariant
    SET
    	AMOModelVariant.AMOModelVariant_name = 'AC'
    WHERE
    AMOModel.Program_id = 2
    AND AMOModelVariant.AMOModel_id=AMOModel.AMOModel_id
    AND AMOModelVariant.AMOModelVariant_id = ItemParents.Parent_id
    AND Delivery.Delivery_id = ItemDelivery.Delivery_id
    AND ItemDelivery.Item_id = Item.Item_id
    AND ItemParents.ParentType_id = 11
    AND ItemParents.Item_id = Item.Item_id 
    AND Item.ItemType_id = ItemType.ItemType_id
    AND Item.ItemStatus_id = IST.ItemStatus_id
    AND AMM.AMOModel_name = 'HLS'
    AND Delivery.Delivery_name LIKE 'HLS_AC%'
    J'ai aussi essayé de mettre toute les tables après le UPDATE mais ca n'a pas marché!

  6. #6
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    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
     
    UPDATE
    	AMOModelVariant 
    SET
    	AMOModelVariant_name = 'AC'
    WHERE
        AMOModelVariant_id IN (   
        SELECT	
        AMOModelVariant_id
        FROM
        AMOModelVariant AMV,
        AMOModel AMM,	
        ItemParents IP,
        Item I,
        ItemType IT,
        ItemStatus IST,
        ItemDelivery ID,
        Delivery D
        WHERE
        AMM.Program_id = 2
        AND AMV.AMOModel_id=AMM.AMOModel_id
        AND AMV.AMOModelVariant_id = IP.Parent_id
        AND D.Delivery_id = ID.Delivery_id
        AND ID.Item_id = I.Item_id
        AND IP.ParentType_id = 11
        AND IP.Item_id = I.Item_id 
        AND I.ItemType_id = IT.ItemType_id
        AND I.ItemStatus_id = IST.ItemStatus_id
        AND AMM.AMOModel_name = 'HLS'
        AND D.Delivery_name LIKE 'HLS_AC%' )
    pas garantie à 100%, j'ai la flemme de décortiquer quand les jointures sont faites comme ça, mais à priori ça devrait fonctionner.

  7. #7
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    La requete fonctionne mais encore une fois elle ne tient pas compte de la condition elle change toute la colonne d'un coup.

    Je comprend pas, pourtant syntaxiquement ca a l'air correct cette fois!

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 19
    Points : 23
    Points
    23
    Par défaut
    et ça donne quoi ça ?


    SELECT
    AMOModelVariant_id
    FROM
    AMOModelVariant AMV,
    AMOModel AMM,
    ItemParents IP,
    Item I,
    ItemType IT,
    ItemStatus IST,
    ItemDelivery ID,
    Delivery D
    WHERE
    AMM.Program_id = 2
    AND AMV.AMOModel_id=AMM.AMOModel_id
    AND AMV.AMOModelVariant_id = IP.Parent_id
    AND D.Delivery_id = ID.Delivery_id
    AND ID.Item_id = I.Item_id
    AND IP.ParentType_id = 11
    AND IP.Item_id = I.Item_id
    AND I.ItemType_id = IT.ItemType_id
    AND I.ItemStatus_id = IST.ItemStatus_id
    AND AMM.AMOModel_name = 'HLS'
    AND D.Delivery_name LIKE 'HLS_AC%' )

    La bonne chose?

  9. #9
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    et sous cette forme ?

    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
     
     
    UPDATE
    	AMOModelVariant 
    SET
    	AMOModelVariant_name = 'AC'
    WHERE
        AMOModelVariant_id IN (  
        SELECT  AMV.AMOModelVariant_id,	
        FROM    AMOModelVariant AMV, 
                JOIN AMOModel AMM ON AMM.AMOModel_id = AMV.AMOModel_id
                JOIN ItemParents IP ON IP.Parent_id = AMV.AMOModelVariant_id
                JOIN Item I ON I.Item_id = IP.Item_id
                JOIN ItemDelivery ID ON ID.Item_id = I.Item_id
                JOIN Delivery D ON D.Delivery_id = ID.Delivery_id
        WHERE   AMM.Program_id = 2
                AND IP.ParentType_id = 11
                AND AMM.AMOModel_name = 'HLS'
                AND D.Delivery_name LIKE 'HLS_AC%'
       )
    au passage, j'ai enlever 2 tables non-utilisées...

  10. #10
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    Non désolé ca marche toujours pas. Ca change la colonne entièrement!

    Pour ppmax la première requete qui fonctionne bien: retourne tous les lignes que je veux UPDATER.
    Mais quand j'essai de les updater au lieu de changer les attributs de la colonne(que j'ai sélectionné avec la requête qui fonctionne bien) elle change tous les attributs de la colonne. En deux mots elle ne respecte pas du tout les contraintes imposées par le WHERE.

  11. #11
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    est-ce que tu peux lancer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT  AMV.AMOModelVariant_id
        FROM    AMOModelVariant AMV
                JOIN AMOModel AMM ON AMM.AMOModel_id = AMV.AMOModel_id
                JOIN ItemParents IP ON IP.Parent_id = AMV.AMOModelVariant_id
                JOIN Item I ON I.Item_id = IP.Item_id
                JOIN ItemDelivery ID ON ID.Item_id = I.Item_id
                JOIN Delivery D ON D.Delivery_id = ID.Delivery_id
        WHERE   AMM.Program_id = 2
                AND IP.ParentType_id = 11
                AND AMM.AMOModel_name = 'HLS'
                AND D.Delivery_name LIKE 'HLS_AC%'
    et t'assurer que cela te retourne ce que tu veux...

    Au passage, vérifie quand même qu'il y a d'autres lignes en comparant avec un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT AMV.AMOModelVariant_id
    FROM AMOModelVariant

  12. #12
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    La première requete que tu as écrit fonctionne bien. Elle me donne la meme chose que la requete que j'ai écrit au début mais plus rapidement que la mienne:

    Résultat: 420 lignes

    Si on prend la meme requete et qu'on enlève la condition AND D.Delivery_name LIKE 'HLS_AC%'

    Résultat: 900 lignes (420 lignes HLS_AC% + autre ligne)


    Ce que je veux c'est que mon UPDATE change juste le ModelVariant_name de ces 420 lignes et pas des 480 autres.

    Peut etre devrais-je redémarrer mon SQL Query Analyzer? bien qu'il semble bien fonctionner...

  13. #13
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par Gwendolyne Voir le message
    Peut etre devrais-je redémarrer mon SQL Query Analyzer? bien qu'il semble bien fonctionner...
    ben ça tiendrait du miracle que le problème vienne de là, mais vu que je sèche, pourquoi ne pas essayer ?

  14. #14
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    Bon ben j'ai redémarré tout, j'ai reéssayé et rien a faire ca marche toujours pas!

    Snirf ...

  15. #15
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    tu peux essayer de nous monter le plan d'exécution ?

  16. #16
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    C'est à dire? Qu'est ce que tu entends par plan d'execution?

  17. #17
    Membre averti Avatar de Sacha999
    Inscrit en
    Mars 2007
    Messages
    294
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mars 2007
    Messages : 294
    Points : 350
    Points
    350
    Par défaut
    Je pense savoir pourquoi ta requete UPDATE ne fonctionne pas comme tu le voudrais. A cause de l'alias que tu donne a la table, tu la reutilise pas dans le UPDATE

    1er cas qui marche (pas d'ambiguité de table):
    UPDATE TABLE_CLIENT
    SET Sexe = 'Male'
    WHERE Prenom = 'Jean'

    2eme cas qui marche (meme que cas 1, mais j'ai rajouté le FROM)
    UPDATE TABLE_CLIENT
    SET Sexe = 'Male'
    FROM TABLE_CLIENT <--- meme chose que 1er cas sauf cette ligne rajouté
    WHERE Prenom = 'Jean'

    par contre 3eme cas qui ne marchera pas (ta facon de faire)
    UPDATE TABLE_CLIENT
    SET Sexe = 'Male'
    FROM TABLE_CLIENT tc<--- meme chose que 2eme cas sauf que la il y a un Alias pour le nom de la table
    WHERE Prenom = 'Jean'

    Pour que le 3eme cas fonctionne il faudrait plutot ecrire
    UPDATE tc <--- ici on met l'alias de la table et pas son vrai nom
    SET Sexe = 'Male'
    FROM TABLE_CLIENT tc
    WHERE Prenom = 'Jean'

  18. #18
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    Bonjour Sacha,

    J'ai essayé en enlevant tous les alias!

    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
    UPDATE
    	AMOModelVariant
    SET
    	AMOModelVariant_name = 'AC'
    WHERE
        AMOModelVariant_id IN (  
        SELECT  AMOModelVariant.AMOModelVariant_id
        FROM    AMOModelVariant
                JOIN AMOModel ON AMOModel.AMOModel_id = AMOModelVariant.AMOModel_id
                JOIN ItemParents ItemParents ON ItemParents.Parent_id = AMOModelVariant.AMOModelVariant_id
                JOIN Item ON Item.Item_id = ItemParents.Item_id
                JOIN ItemDelivery ON ItemDelivery.Item_id = Item.Item_id
                JOIN Delivery ON Delivery.Delivery_id = ItemDelivery.Delivery_id
        WHERE   AMOModel.Program_id = 2
                AND ItemParents.ParentType_id = 11
                AND AMOModel.AMOModel_name = 'HLS'
                AND Delivery.Delivery_name LIKE 'HLS_AC%'
       )
    Mais ca marche toujours pas!
    Ca marche pas non plus en mettant l'alias comme tu le montre dans ton dernier cas.

    Si quelqu'un a une autre idée, n'hésitez pas!

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 40
    Points : 47
    Points
    47
    Par défaut
    Salut Gwendolyne,

    J'ai essayé cette syntaxe chez moi ça semble faire ce dont tu as besoin.
    Attention si tu fais des join inutiles c'est normal que ça te change toute la colonne. Il faut que tu limites tes join aux tables sur lesquelles tu vas filtrer. Ta requête devrait du coup donner ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    UPDATE AMOModelVariant
    SET AMOModelVariant.AMOModelVariant_name = 'AC'
    FROM AMOModelVariant AS MV 
    JOIN AMOModel AS M ON M.AMOModel_id=MV.AMOModel_id
    JOIN ItemParents AS IP ON IP.Parent_id=MV.AMOModelVariant_id
    JOIN ItemDelivery AS ID ON ID.Item_id=IP.Item_id
    JOIN Delivery AS DEL ON DEL.Delivery_id=ID.Delivery_id
    WHERE MV.AMOModel_name='HLS'
    AND DEL.Delivery_name LIKE 'HLS_AC%'
    AND IP.ParentType_id=11
    Je pense que ça devrait fonctionner n'hésite pas aussi à revoir tes conditions peut être que tu zappes quelque chose ou que tes filtres ne sont pas bons.

    Bon Courage

  20. #20
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par maverickbj Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    UPDATE AMOModelVariant
    SET AMOModelVariant.AMOModelVariant_name = 'AC'
    FROM AMOModelVariant AS MV 
    JOIN AMOModel AS M ON M.AMOModel_id=MV.AMOModel_id
    JOIN ItemParents AS IP ON IP.Parent_id=MV.AMOModelVariant_id
    JOIN ItemDelivery AS ID ON ID.Item_id=IP.Item_id
    JOIN Delivery AS DEL ON DEL.Delivery_id=ID.Delivery_id
    WHERE MV.AMOModel_name='HLS'
    AND DEL.Delivery_name LIKE 'HLS_AC%'
    AND IP.ParentType_id=11
    Vous pourriez arrêter avec vos update..from ? Ca me pique les yeux !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème SQL avec conditions sur un UPDATE
    Par sebbilou dans le forum Langage SQL
    Réponses: 1
    Dernier message: 16/10/2008, 15h21
  2. [Debutant]Problème de condition
    Par ghan77 dans le forum Langage
    Réponses: 9
    Dernier message: 13/12/2005, 15h20
  3. Problème de condition, je flanche..
    Par KibitO dans le forum Langage
    Réponses: 13
    Dernier message: 11/11/2005, 12h57
  4. Réponses: 6
    Dernier message: 17/08/2005, 12h38
  5. Plusieur Condition dans REquette UPDATE
    Par ducseb dans le forum Langage SQL
    Réponses: 12
    Dernier message: 11/08/2005, 11h46

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