Обновите несколько столбцов в SQL с помощью привязанного идентификатора из нескольких частей - PullRequest
3 голосов
/ 18 января 2010

Я пытаюсь обновить несколько столбцов в инструкции MS SQL, используя подзапрос. Поиск привел меня к чему-то вроде:

UPDATE table1
SET col1 = a.col1, col2 = a.col2, col3 = a.col3 FROM
(SELECT col1, col2, col3 from table2 where <expression>) AS a
WHERE table1.col1 <expression>

http://geekswithblogs.net/phoenix/archive/2009/10/13/update-multiple-columns-on-sql-server.aspx

Моя проблема в том, что во внутреннем выражении WHERE мне нужна ссылка на конкретное поле в таблице1:

UPDATE table1
SET col1 = a.col1, col2 = a.col2, col3 = a.col3 FROM
(SELECT col1, col2, col3 from table2 where table1.col0 = table2.col0) AS a
WHERE table1.col1 <expression>

Когда я запускаю этот запрос, я получаю «Идентификатор из нескольких частей» table1.col0 », который не может быть привязан. ". Очевидно, что при использовании этого синтаксиса SQL не может связать текущую запись table1 в подзапросе. Сейчас я повторяю подзапрос для каждого поля и использую синтаксис:

UPDATE table1
SET col1 = (subquery), col2 = (subquery)...

Но это выполняет подзапрос (который очень дорогой) один раз для столбца, чего я хотел бы избежать.

Есть идеи?

Ответы [ 3 ]

10 голосов
/ 18 января 2010

на сервере sql, вы можете использовать предложение from в запросе на обновление. Присоединяйтесь к столам, как в избранном. Обновляемая таблица должна быть включена в объединения.

update table_1
  set field_1 = table_2.value_1
  from table_1
    inner join table_2
      on (table_1.id = table_2.id)
2 голосов
/ 09 июля 2011

Ваш автомобиль использует команду CROSS APPLY для обновления нескольких столбцов из дополнительного выбора

UPDATE t1
SET t1.col1 = a.col1, t1.col2 = a.col2, t1.col3 = a.col3 
FROM table1 t1
CROSS APPLY
(SELECT col1, col2, col3 from table2 where table1.col0 = table2.col0) a(col1,col2,col3)
1 голос
/ 18 января 2010

Или, если вам не нравится синтаксис объединения, это также будет работать:

UPDATE table1
SET col1 = a.col1, col2 = a.col2, col3 = a.col3 
FROM table1, table2 as a
WHERE table1.col0 = a.col0
AND table1.col1 <expression>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...