probleme de requete update avec select

a marqué ce sujet comme résolu.

Bonjour tout le monde, ma requête est la suivante:

UPDATE produits p set p.quantite_produit_commande
FROM (

SELECT
    p.id_produit,
    p.nom_produit,
    (p.quantite_produit_commande) as "Quantité en stock" ,
    (SUM(lc.quantite))  as "Quantité commandée" ,
    (p.quantite_produit_commande -  SUM(lc.quantite)) as stock_restant
    FROM produits p
    INNER JOIN lignes_commandes lc ON lc.id_produit = p.id_produit
    GROUP BY p.id_produit)
    WHERE p.id_produit = 1;

    

j’aimerai mettre à jour mon stock restant, en ce basant sur la quantité en stock et la quantité commandé, mais j’ai une erreur de syntaxe quelqu’un a une idée MErci

+0 -0

Bonsoir,

Je n’ai jamais vu la syntaxe update set X from select. J’aurais mis un = à la place du from, mais admettons que ce soit correct. Deux choses me choquent quand même immédiatement:

  • Tu mets à jour une seule colonne, alors que tu en remontes trois dans ton select. Il faut prendre laquelle des trois ? ET même si dans ce genre de cas ça prend toujours la première ou la dernière, ça reste hasardeux et avec deux colonnes inutiles
  • Tu mets à jour et tu sélectionnes dans la même table, je ne suis pas sûr que ce soit possible ou alors avec comportement indéfini. Il me semble que tu dois obligatoirement passer par une table dérivée/temporaire.

Si ton intention était de mettre à jour plusieurs colonnes à la fois de ta table produits, j’essaierais plutôt de faire une requête replace, ou insert … on duplicate key update. Le update … select peut fonctionner aussi si tu enlèves la partie set X = ..., Y = ...mais attention à l’ordre et aux noms des colonnes.

Sinon, eh bien, commence par ne sélectionner q’une seule colonne, ça ira sûrement déjà mieux.

+0 -0

Sans que le système de gestion de base de données soit précisé j’ai considéré par défaut qu’il s’agissait de PostgreSQL.

Mais donc UPDATE ... FROM est une syntaxe parfaitement valide, ça permet d’utiliser les valeurs d’une table / CTE pendant l'update.

Par contre un SET sans valeur je n’ai jamais vu, ça ne ressemble pas à une syntaxe valide (et je ne vois pas ce que ça devrait faire).

Sans que le système de gestion de base de données soit précisé j’ai considéré par défaut qu’il s’agissait de PostgreSQL. Mais donc UPDATE … FROM est une syntaxe parfaitement valide, ça permet d’utiliser les valeurs d’une table / CTE pendant l’update.

OK, c’est plus ou moins ce que je pensais. Donc soit il a voulu écrire:
update table from select ... from autreTable
et donc le set est de trop, ou alors: update table set champ = select ... from autreTable
auquel cas c’est = à la place de from.

Petite question pour ma culture personnelle du coup, est-ce qu’on peut préciser le nom / l’ordre des colonnes avec cette syntaxe ùpdate from`, ? Parce que sinon ça me parait un peu risqué comme truc.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte