J'ai une instruction pour mettre à jour un champ si un enregistrement de table connexe existe. La requête est mise à jour pour chaque enregistrement. Je n'étais pas sûr de ce que la façon la plus efficace/meilleure pratique de le faire serait. Jusqu'à présent, je suis venu avec 2 solutionsCas VS Mises à jour multiples
Solution One: Déclaration de cas
UPDATE item
SET IsRestricted =
CASE
WHEN restriction.Id is null THEN 0
ELSE 1
END
FROM [dbo].[Item] item
left join [dbo].[Restriction] restriction
on restriction.Id = item.Id
Solution Deux: déclarations de mise à jour multiples
UPDATE item
SET IsRestricted = 1
FROM [dbo].[Restriction] restriction
inner join [dbo].[Item] item
on restriction.Id = item.Id
UPDATE item
SET IsRestricted = 0
FROM [dbo].[Item] item
left join [dbo].[Restriction] restriction
on item.Id = restriction.Id
WHERE restriction.Id is null
Si quelqu'un pouvait me aider à évaluer qui Je devrais l'utiliser serait apprécié. Je ne sais pas s'il s'agit d'un article en double, pour l'instant seulement ceux que j'ai vu impliquent des déclencheurs ou d'autres choses et je ne sais pas si cela change la réponse. N'hésitez pas à suggérer des approches alternatives
Avez-vous besoin de la colonne IsRestricted? Ne pas interroger pour la présence/l'absence de restrictions à un moment choisi vous garantit-il toujours la bonne réponse? –
Mettez les deux dans la même fenêtre de requête, activez « Inclure plan d'exécution réelle » (ctrl + m), exécutez le lot, observer les résultats :) – Blorgbeard
@Damien le drapeau est là parce que l'utilisation de la base de données va être assez intense performances et nous ne voulons pas avoir à faire des recherches au moment choisi. Bien que je ne cherchais pas vraiment une réponse spécifique à mon problème autant qu'une comparaison générale des deux méthodes, – Manatherin