Подтвердить что ты не робот

Обновление запроса с использованием подзапроса на сервере Sql

У меня есть простая таблица Структура вроде этого:

Таблица tempData​​strong >

╔══════════╦═══════╗
║   NAME   ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║    80 ║
║ Ravi     ║    85 ║
║ Sanjay   ║    90 ║
╚══════════╩═══════╝

И у меня также есть другие имена таблиц как tempDataView, подобные этому

╔══════════╦═══════╗
║   NAME   ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║       ║
║ Narendra ║       ║
║ Narendra ║       ║
║ Narendra ║       ║
║ Ravi     ║       ║
║ Ravi     ║       ║
║ Sanjay   ║       ║
╚══════════╩═══════╝

Я хочу обновить таблицу tempDataView, установив Знаки в соответствии с tempDataView - Имя с tempData​​strong > - Имя

Да, позвольте мне показать вам, что я пробовал, я попытался решить эту проблему с помощью курсора и полностью решил, но я нахожу способ его решить, используя Подзапрос

Вот он:

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

На самом деле это как домашняя работа для меня, чтобы решить ее с помощью подзапроса.

4b9b3361

Ответ 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