Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Requete : UPDATE sur la meme table

4 réponses
Avatar
Gislain
Bonjour,

Je vais faire appel aux gouroux des requêtes.
Pour une gestion de produits, j'ai une table "ArtCent" dans laquelle se
trouve un catalogue de produits en ligne , un catalogue de produit en
attente de validation.

Chaque produit se trouve donc deux fois dans la table avec un champ bit
indiquant si c'est une fiche en ligne ou en validation. Cette distinction
est effectuée grace à la zone "Simulation", qui est à 1 lorsque c'est une
fiche est en attente de validation. Le lien sur les deux fiches produits
s'effectue par la colonne "Reference".

Mon problème est de mettre à jour la base en ligne depuis les donnees en
attente de validation (en simulation) en une seule reqête.

Voici ma requête en simplifiée sur la mise à jour uniquement d'une colonne

UPDATE ArtCent
SET CataloguePage = ACR.CataloguePage
FROM ArtCent as ACR
WHERE ArtCent.Reference = ACR.Reference
and ACR.Simulation = 0
and ArtCent.Simulation = 1


Et voici les messages d'erreur :
Serveur : Msg 107, Niveau 16, État 3, Ligne 1
Le préfixe de colonne 'ArtCent' ne correspond ni au nom de table ni au nom
d'alias utilisés dans la requête.
Serveur : Msg 107, Niveau 16, État 1, Ligne 1
Le préfixe de colonne 'ArtCent' ne correspond ni au nom de table ni au nom
d'alias utilisés dans la requête.


Je tourne en rond !!! Dois-je passer par une vue intermédiaire (beurk ...)

Merci de vos lumières.

Gislain.

4 réponses

Avatar
Patrice
Quelque chose comme (NON TESTE) :

UPDATE ArtCent
SET CataloguePage¬R.CataloguePage
FROM ArctCent
JOIN ArtcEnt AS ACR ON ArctCent.Reference¬R.Reference AND ACR.Simulation=0
WHERE ArtCent.Simulation=1

Cf la doc du UPDATE pour les détails (en gros tout fonctionne comme pour un
SELECT avec après le UPDATE le nom de la table à mettre à jour)...

--
Patrice

"Gislain" a écrit dans le message de
news:
Bonjour,

Je vais faire appel aux gouroux des requêtes.
Pour une gestion de produits, j'ai une table "ArtCent" dans laquelle se
trouve un catalogue de produits en ligne , un catalogue de produit en
attente de validation.

Chaque produit se trouve donc deux fois dans la table avec un champ bit
indiquant si c'est une fiche en ligne ou en validation. Cette distinction
est effectuée grace à la zone "Simulation", qui est à 1 lorsque c'est une
fiche est en attente de validation. Le lien sur les deux fiches produits
s'effectue par la colonne "Reference".

Mon problème est de mettre à jour la base en ligne depuis les donnees en
attente de validation (en simulation) en une seule reqête.

Voici ma requête en simplifiée sur la mise à jour uniquement d'une colonne

UPDATE ArtCent
SET CataloguePage = ACR.CataloguePage
FROM ArtCent as ACR
WHERE ArtCent.Reference = ACR.Reference
and ACR.Simulation = 0
and ArtCent.Simulation = 1


Et voici les messages d'erreur :
Serveur : Msg 107, Niveau 16, État 3, Ligne 1
Le préfixe de colonne 'ArtCent' ne correspond ni au nom de table ni au nom
d'alias utilisés dans la requête.
Serveur : Msg 107, Niveau 16, État 1, Ligne 1
Le préfixe de colonne 'ArtCent' ne correspond ni au nom de table ni au nom
d'alias utilisés dans la requête.


Je tourne en rond !!! Dois-je passer par une vue intermédiaire (beurk ...)

Merci de vos lumières.

Gislain.




Avatar
Gislain
La solution était dans l'aide...

En fait, si l'on reprend ma requête initiale,
UPDATE ArtCent
SET CataloguePage = ACR.CataloguePage
FROM ArtCent as ACR
WHERE ArtCent.Reference = ACR.Reference
and ACR.Simulation = 0
and ArtCent.Simulation = 1

L'aide annonce : Un alias de table spécifié dans une clause FROM ne peut pas
être utilisé en tant que qualificateur dans SET column_name.

Donc la solution réside à ne pas spécifier ma table en Update dans les
clauses du Where.
On se retrouve donc avec :

UPDATE ArtCent
SET CataloguePage = ACR.CataloguePage
FROM ArtCent as ACR
WHERE Simulation = 0
and Reference = ACR.Reference
and ACR.Simulation = 0


A+

Gislain



"Patrice" a écrit dans le message de
news:%238eG%
Quelque chose comme (NON TESTE) :

UPDATE ArtCent
SET CataloguePage¬R.CataloguePage
FROM ArctCent
JOIN ArtcEnt AS ACR ON ArctCent.Reference¬R.Reference AND


ACR.Simulation=0
WHERE ArtCent.Simulation=1

Cf la doc du UPDATE pour les détails (en gros tout fonctionne comme pour


un
SELECT avec après le UPDATE le nom de la table à mettre à jour)...

--
Patrice

"Gislain" a écrit dans le message de
news:
> Bonjour,
>
> Je vais faire appel aux gouroux des requêtes.
> Pour une gestion de produits, j'ai une table "ArtCent" dans laquelle se
> trouve un catalogue de produits en ligne , un catalogue de produit en
> attente de validation.
>
> Chaque produit se trouve donc deux fois dans la table avec un champ bit
> indiquant si c'est une fiche en ligne ou en validation. Cette


distinction
> est effectuée grace à la zone "Simulation", qui est à 1 lorsque c'est


une
> fiche est en attente de validation. Le lien sur les deux fiches produits
> s'effectue par la colonne "Reference".
>
> Mon problème est de mettre à jour la base en ligne depuis les donnees en
> attente de validation (en simulation) en une seule reqête.
>
> Voici ma requête en simplifiée sur la mise à jour uniquement d'une


colonne
>
> UPDATE ArtCent
> SET CataloguePage = ACR.CataloguePage
> FROM ArtCent as ACR
> WHERE ArtCent.Reference = ACR.Reference
> and ACR.Simulation = 0
> and ArtCent.Simulation = 1
>
>
> Et voici les messages d'erreur :
> Serveur : Msg 107, Niveau 16, État 3, Ligne 1
> Le préfixe de colonne 'ArtCent' ne correspond ni au nom de table ni au


nom
> d'alias utilisés dans la requête.
> Serveur : Msg 107, Niveau 16, État 1, Ligne 1
> Le préfixe de colonne 'ArtCent' ne correspond ni au nom de table ni au


nom
> d'alias utilisés dans la requête.
>
>
> Je tourne en rond !!! Dois-je passer par une vue intermédiaire (beurk


...)
>
> Merci de vos lumières.
>
> Gislain.
>
>




Avatar
Patrice
Hummm... ACR est juste un alias pour ArtCent. alors que si j'ai bien
compris le départ tu veux mettre à jour un enregistrement selon un autre
enregistrement dans la même table....

--
Patrice

"Gislain" a écrit dans le message de
news:
La solution était dans l'aide...

En fait, si l'on reprend ma requête initiale,
UPDATE ArtCent
SET CataloguePage = ACR.CataloguePage
FROM ArtCent as ACR
WHERE ArtCent.Reference = ACR.Reference
and ACR.Simulation = 0
and ArtCent.Simulation = 1

L'aide annonce : Un alias de table spécifié dans une clause FROM ne peut


pas
être utilisé en tant que qualificateur dans SET column_name.

Donc la solution réside à ne pas spécifier ma table en Update dans les
clauses du Where.
On se retrouve donc avec :

UPDATE ArtCent
SET CataloguePage = ACR.CataloguePage
FROM ArtCent as ACR
WHERE Simulation = 0
and Reference = ACR.Reference
and ACR.Simulation = 0


A+

Gislain



"Patrice" a écrit dans le message de
news:%238eG%
> Quelque chose comme (NON TESTE) :
>
> UPDATE ArtCent
> SET CataloguePage¬R.CataloguePage
> FROM ArctCent
> JOIN ArtcEnt AS ACR ON ArctCent.Reference¬R.Reference AND
ACR.Simulation=0
> WHERE ArtCent.Simulation=1
>
> Cf la doc du UPDATE pour les détails (en gros tout fonctionne comme pour
un
> SELECT avec après le UPDATE le nom de la table à mettre à jour)...
>
> --
> Patrice
>
> "Gislain" a écrit dans le message de
> news:
> > Bonjour,
> >
> > Je vais faire appel aux gouroux des requêtes.
> > Pour une gestion de produits, j'ai une table "ArtCent" dans laquelle


se
> > trouve un catalogue de produits en ligne , un catalogue de produit en
> > attente de validation.
> >
> > Chaque produit se trouve donc deux fois dans la table avec un champ


bit
> > indiquant si c'est une fiche en ligne ou en validation. Cette
distinction
> > est effectuée grace à la zone "Simulation", qui est à 1 lorsque c'est
une
> > fiche est en attente de validation. Le lien sur les deux fiches


produits
> > s'effectue par la colonne "Reference".
> >
> > Mon problème est de mettre à jour la base en ligne depuis les donnees


en
> > attente de validation (en simulation) en une seule reqête.
> >
> > Voici ma requête en simplifiée sur la mise à jour uniquement d'une
colonne
> >
> > UPDATE ArtCent
> > SET CataloguePage = ACR.CataloguePage
> > FROM ArtCent as ACR
> > WHERE ArtCent.Reference = ACR.Reference
> > and ACR.Simulation = 0
> > and ArtCent.Simulation = 1
> >
> >
> > Et voici les messages d'erreur :
> > Serveur : Msg 107, Niveau 16, État 3, Ligne 1
> > Le préfixe de colonne 'ArtCent' ne correspond ni au nom de table ni au
nom
> > d'alias utilisés dans la requête.
> > Serveur : Msg 107, Niveau 16, État 1, Ligne 1
> > Le préfixe de colonne 'ArtCent' ne correspond ni au nom de table ni au
nom
> > d'alias utilisés dans la requête.
> >
> >
> > Je tourne en rond !!! Dois-je passer par une vue intermédiaire (beurk
...)
> >
> > Merci de vos lumières.
> >
> > Gislain.
> >
> >
>
>




Avatar
Fred BROUARD
Bonjour,

La norme SQL, et SQL Server respecte assez bien la norme, interdit de donner un
alias à une table cible d'une mise à jour (INSERT, UPDATE, DELETE).
Pour une bonne et simple raison : il ne peut absolument pas y avoir d'ambiguité
car il ne peut jamais y avoir qu'une seule table cible dans les ordres SQL
INSERT, UPDATE et DELETE, et que la table est toujours explicitement décrite :

UPDATE <LaTableCible>
...

DELETE FROM <LaTableCible>
...

INSERT INTO <LaTableCible>
...

En conclusion, la référence à une colonne de la table cible ne permet pas
l'utilisation d'alias !

Autrement dit :

UPDATE ArtCent
SET CataloguePage = ACR.CataloguePage
FROM ArtCent as ACR
WHERE Reference = ACR.Reference
AND ACR.Simulation = 0
AND Simulation = 1

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************



Gislain a écrit:
Bonjour,

Je vais faire appel aux gouroux des requêtes.
Pour une gestion de produits, j'ai une table "ArtCent" dans laquelle se
trouve un catalogue de produits en ligne , un catalogue de produit en
attente de validation.

Chaque produit se trouve donc deux fois dans la table avec un champ bit
indiquant si c'est une fiche en ligne ou en validation. Cette distinction
est effectuée grace à la zone "Simulation", qui est à 1 lorsque c'est une
fiche est en attente de validation. Le lien sur les deux fiches produits
s'effectue par la colonne "Reference".

Mon problème est de mettre à jour la base en ligne depuis les donnees en
attente de validation (en simulation) en une seule reqête.

Voici ma requête en simplifiée sur la mise à jour uniquement d'une colonne

UPDATE ArtCent
SET CataloguePage = ACR.CataloguePage
FROM ArtCent as ACR
WHERE ArtCent.Reference = ACR.Reference
and ACR.Simulation = 0
and ArtCent.Simulation = 1


Et voici les messages d'erreur :
Serveur : Msg 107, Niveau 16, État 3, Ligne 1
Le préfixe de colonne 'ArtCent' ne correspond ni au nom de table ni au nom
d'alias utilisés dans la requête.
Serveur : Msg 107, Niveau 16, État 1, Ligne 1
Le préfixe de colonne 'ArtCent' ne correspond ni au nom de table ni au nom
d'alias utilisés dans la requête.


Je tourne en rond !!! Dois-je passer par une vue intermédiaire (beurk ...)

Merci de vos lumières.

Gislain.