Обновить вопрос подзапроса с внешним ключом
-
19-08-2019 - |
Вопрос
Я неправильно запомнил, какой ключ был для этой таблицы шаблонов, и поэтому я добавил неправильное поле в качестве внешнего ключа. Теперь мне нужно добавить внешний ключ, и я хочу заполнить его значения на основе этого другого поля, которое уже заполнено. Я начал пытаться сделать это с помощью оператора update, но я не уверен, как это сделать.
Часть моей схемы:
Таблица продуктов:
ProductName (key)
TemplateName
TemplateID
...
Я добавил TemplateID, но в нем еще нет данных, и он может быть пустым.
Таблица шаблонов:
TemplateID (key)
TemplateName
...
Я хочу использовать таблицу Templates, чтобы найти соответствующий TemplateID для каждого TemplateName в таблице Products и заполнить его ссылкой на внешний ключ в таблице Products.
Могу ли я сделать это с помощью подзапроса в Update или мне нужно написать какой-нибудь сохраненный процесс? Я использую Sql Server 2008
Решение
Вы можете сделать это с помощью простого запроса UPDATE
UPDATE Products
SET Products.TemplateID = Templates.TemplateID
FROM Templates
WHERE Templates.TemplateName = Products.TemplateName
Вам не нужно указывать таблицу Products в предложении FROM или в предложении JOIN. Просто укажите таблицу шаблонов в предложении FROM. Вы можете использовать имя таблицы, которое вы используете в предложении UPDATE в предложении WHERE, для сопоставления записей из обеих таблиц.
Другие советы
Вот решение для соединения. Важно то, что будут обновляться только совпадающие строки.
Update p
Set p.TemplateId = t.TemplateId
From Products p
join Templates t
On p.TemplateName = t.TemplateName
Вот решение подзапроса. Каждая строка продуктов будет обновляться, даже если нет совпадений.
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