Обновление запроса с использованием подзапроса на сервере Sql
У меня есть простая таблица Структура вроде этого:
Таблица tempDatastrong >
╔══════════╦═══════╗
║ NAME ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║ 80 ║
║ Ravi ║ 85 ║
║ Sanjay ║ 90 ║
╚══════════╩═══════╝
И у меня также есть другие имена таблиц как tempDataView, подобные этому
╔══════════╦═══════╗
║ NAME ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║ ║
║ Narendra ║ ║
║ Narendra ║ ║
║ Narendra ║ ║
║ Ravi ║ ║
║ Ravi ║ ║
║ Sanjay ║ ║
╚══════════╩═══════╝
Я хочу обновить таблицу tempDataView, установив Знаки в соответствии с tempDataView - Имя с tempDatastrong > - Имя
Да, позвольте мне показать вам, что я пробовал, я попытался решить эту проблему с помощью курсора и полностью решил, но я нахожу способ его решить, используя Подзапрос
Вот он:
Declare @name varchar(50),@marks varchar(50)
Declare @cursorInsert CURSOR
set @cursorInsert = CURSOR FOR
Select name,marks from tempData
OPEN @cursorInsert
FETCH NEXT FROM @cursorInsert
into @name,@marks
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE tempDataView set marks = @marks where name = @name
FETCH NEXT FROM @cursorInsert
INTO @name,@marks
END
CLOSE @cursorInsert
DEALLOCATE @cursorInsert
На самом деле это как домашняя работа для меня, чтобы решить ее с помощью подзапроса.
Ответы
Ответ 1
вы можете присоединиться к обеим таблицам даже в операторах UPDATE
,
UPDATE a
SET a.marks = b.marks
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
для повышения производительности, определите INDEX
в столбце marks
для обеих таблиц.
используя SUBQUERY
UPDATE tempDataView
SET marks =
(
SELECT marks
FROM tempData b
WHERE tempDataView.Name = b.Name
)
Ответ 2
потому что вы просто учитесь, я предлагаю вам практиковать преобразование соединений SELECT в UPDATE или DELETE. Сначала я предлагаю вам сгенерировать оператор SELECT, соединяющий эти две таблицы:
SELECT *
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
Затем обратите внимание, что у нас есть две псевдонимы таблицы a
и b
. Используя эти псевдонимы, вы можете легко сгенерировать инструкцию UPDATE для обновления таблицы a или b. Для таблицы a у вас есть ответ, предоставленный JW. Если вы хотите обновить b
, инструкция будет выглядеть следующим образом:
UPDATE b
SET b.marks = a.marks
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
Теперь, чтобы преобразовать оператор в оператор DELETE, используйте тот же подход. Вышеприведенное выражение удалит только из a
(оставив b intact) для тех записей, которые соответствуют по имени:
DELETE a
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
Вы можете использовать SQL Fiddle, созданный JW, в качестве игровой площадки
Ответ 3
Заголовок этого потока спрашивает, как можно использовать подзапрос в обновлении. Вот пример этого:
update [dbName].[dbo].[MyTable]
set MyColumn = 1
where
(
select count(*)
from [dbName].[dbo].[MyTable] mt2
where
mt2.ID > [dbName].[dbo].[MyTable].ID
and mt2.Category = [dbName].[dbo].[MyTable].Category
) > 0