Question

Je me suis mal souvenu de ce qu’était la clé pour cette table de modèles et j’ai donc ajouté le mauvais champ en tant que clé étrangère. Maintenant, je dois ajouter la clé étrangère et je veux renseigner ses valeurs en fonction de cet autre champ déjà rempli. J'ai commencé à essayer de le faire avec une déclaration de mise à jour, mais je ne sais pas comment le faire.

Partie de mon schéma:

Table des produits:

ProductName (key)
TemplateName
TemplateID
...

J'ai ajouté le TemplateID, mais il ne contient pas encore de données et est nullable.

Table de modèles:

TemplateID (key)
TemplateName
...

Je souhaite utiliser la table Modèles pour trouver l'ID modèle correspondant à chaque nom de modèle dans la table Produits et le renseigner dans la référence de clé étrangère de la table Produits.

Puis-je faire cela avec une sous-requête dans Update ou dois-je écrire une sorte de procédure stockée? J'utilise SQL Server 2008

Était-ce utile?

La solution

Vous pouvez le faire avec une simple requête UPDATE

UPDATE Products
SET Products.TemplateID = Templates.TemplateID
FROM Templates
WHERE Templates.TemplateName = Products.TemplateName

Vous n'avez pas besoin de spécifier la table Products dans la clause FROM, ni une clause JOIN. Spécifiez simplement la table Templates dans la clause FROM. Vous pouvez utiliser le nom de table que vous utilisez dans la clause UPDATE de la clause WHERE pour mettre en corrélation les enregistrements de deux tables.

Autres conseils

Voici une solution de jointure. Il est important que seules les lignes correspondantes soient mises à jour.

Update p
Set p.TemplateId = t.TemplateId
From Products p
  join Templates t
  On p.TemplateName = t.TemplateName

Voici la solution de sous-requête. Chaque ligne de produits sera mise à jour, même en l'absence de correspondance.

Update p
Set p.TemplateId =
(
  Select t.TemplateId
  From Templates t
  Where p.TemplateName = t.TemplateName
)
From Products p
update Templates
set TemplateId=Products.TemplateId
from Templates
inner join Products
   on Templates.TemplateName=Products.TemplateName
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top