• [^] # Re: Si j'ai bien compris ta demande...

    Posté par . En réponse au message Requete update délicate. Évalué à 2.

    Comment ça il la prend ? On ne lui dit jamais d'utiliser la table client ???
    C'est pas normal là !
    N'utilises pas cette requête !
    Ou alors c'est une syntaxe "avancée" de postgresql...
    Evite.

    Par contre, j'ai trouvé une syntaxe correcte (à adapter avec la table affaire) :

    UPDATE commande
    SET activitecmde = COALESCE(
    ( SELECT activitecli
    FROM client
    WHERE client.numclient = commande.numclient
    AND activitecli > 10
    AND activitecmde < 20
    ), activitecmde);

    Celle là fonctionne.
    En fait, elle met la valeur d'activitecli si elle est trouvée (avec les trois critères). Dans le cas contraire, le sous-requête renvoie NULL, et la fonction COALESCE (dont c'est le rôle - NVL() sous Oracle) renvoie la seconde valeur à la place, soit la valeur originale d'activitecmde, qui sera donc remplacée par elle même...

    Ce n'est pas très propre parceque ça met tout à jour, y compris les lignes qui en réalité ne bougent pas... Ca peut être lourd.
    Je ne voit pas mieux pour l'instant, je ne suis pas vraiment expert en SQL... J'en fait assez peu.

    En fait, un problème comme ça devrait plutôt se régler en deux temps (sélection des lignes concernés, puis mise à jour) avec un curseur ou autre.

    Ma requête va avoir des performances pourries vu qu'on met à jour toute la table...

    Bonne chance.

    Et n'utilise pas ma première requête, ou du moins vérifie avant cette histoire de syntaxe sur la table client non déclarée !