Обновить вопрос подзапроса с внешним ключом - PullRequest
0 голосов
/ 23 января 2009

Я неправильно запомнил, какой ключ был для этой таблицы шаблонов, и поэтому я добавил неправильное поле в качестве внешнего ключа. Теперь мне нужно добавить внешний ключ, и я хочу заполнить его значения на основе этого другого поля, которое уже заполнено. Я начал пытаться сделать это с помощью оператора update, но я не уверен, как это сделать.

Часть моей схемы:

Таблица продуктов:

ProductName (key)
TemplateName
TemplateID
...

Я добавил TemplateID, но в нем еще нет данных, и он может быть пустым.

Таблица шаблонов:

TemplateID (key)
TemplateName
...

Я хочу использовать таблицу шаблонов, чтобы найти соответствующий TemplateID для каждого TemplateName в таблице Products и заполнить его ссылкой на внешний ключ в таблице Products.

Могу ли я сделать это с помощью подзапроса в Update, или мне нужно написать какой-нибудь Stored Proc? Я использую Sql Server 2008

Ответы [ 3 ]

2 голосов
/ 23 января 2009

Вы можете сделать это простым запросом ОБНОВЛЕНИЯ

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

Вам не нужно указывать таблицу Products в предложении FROM или в предложении JOIN. Просто укажите таблицу шаблонов в предложении FROM. Вы можете использовать имя таблицы, которое вы используете в предложении UPDATE в предложении WHERE, для сопоставления записей из обеих таблиц.

1 голос
/ 23 января 2009

Вот решение для соединения. Важно то, что будут обновляться только совпадающие строки.

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
0 голосов
/ 23 января 2009
update Templates
set TemplateId=Products.TemplateId
from Templates
inner join Products
   on Templates.TemplateName=Products.TemplateName
...