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

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

    "J'avais pas précisé que numclient est pas ds commande"

    erreur ! c'est un point essentiel !
    Le problème principal de ta requête initiale, c'est que tu ne fais aucun lien entre la ligne de la table commande que tu es en train de mettre à jour et le select de la valeur. Il y a bien la table commande dans les deux cas, mais ton select travaille sur toute la table commande, au lieu de ne travailler que sur la ligne intéressante.

    Il faut que tu explicites le lien entre une commande et un client.
    S'il n'y a pas de numclient dans commande, comment tu lies une commande et un client ? (la table affaire ?)

    Les requêtes d'update un peu complexe, c'est le truc que j'ai mis le plus de temps à intégrer. Pour bien comprendre ce que je fais, je travaille séparément sur les clauses WHERE. La clause WHERE sur la table commande (la seconde ici) sert à limiter le nombre de lignes qu'on va traiter. Ce qu'il faut arriver à se mettre dans le crâne, c'est que quand on travaille sur la clause WHERE dans le SET (la première), on ne travaille plus sur toute la table commande, mais sur une seul des lignes sélectionnée par le WHERE sur la table commande.
    Pour que la valeur qu'on met dans le SET corresponde à quelquechose, il faut absolument faire le lien avec la table commande qu'on update, et pas avec la table commande en général. Un truc du genre

    update commande C -- nommer la table pour pouvoir l'utiliser après
    set activitecmde = (select t.valeur
    from table t
    where T.un_champ = C.un_champ -- la relation entre la table et le select
    ... -- le reste de la clause WHERE)
    where c.activitecmde < 20;

    Pour répondre plus précisément à ta situation, il faut que tu explicites le lien entre une commande et un client.