在Sql Server中使用子查询更新查询
我有一个简单的表结构像这样:
表tempData
╔══════════╦═══════╗ ║ NAME ║ MARKS ║ ╠══════════╬═══════╣ ║ Narendra ║ 80 ║ ║ Ravi ║ 85 ║ ║ Sanjay ║ 90 ║ ╚══════════╩═══════╝
而我也有这样的另一个表名tempDataView
╔══════════╦═══════╗ ║ NAME ║ MARKS ║ ╠══════════╬═══════╣ ║ Narendra ║ ║ ║ Narendra ║ ║ ║ Narendra ║ ║ ║ Narendra ║ ║ ║ Ravi ║ ║ ║ Ravi ║ ║ ║ Sanjay ║ ║ ╚══════════╩═══════╝
我想通过设置标记根据tempDataView – Name与tempData – Name比较来更新表tempDataView
是让我告诉你我所尝试的,我试图解决这个使用光标,它的解决完美,但我find了解决这个问题的方法使用子查询
这里是:
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
其实这就像我使用子查询来解决它的功课。
你甚至可以在UPDATE
语句上连接两个表,
UPDATE a SET a.marks = b.marks FROM tempDataView a INNER JOIN tempData b ON a.Name = b.Name
- SQLFiddle演示
要获得更快的性能,请在两个表上的列marks
上定义一个INDEX
。
使用SUBQUERY
UPDATE tempDataView SET marks = ( SELECT marks FROM tempData b WHERE tempDataView.Name = b.Name )
- SQLFiddle演示
因为你只是学习,我build议你练习转换一个SELECT连接到UPDATE或DELETE连接。 首先,我build议你生成一个连接这两个表的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)中删除那些名字相符的logging:
DELETE a FROM tempDataView a INNER JOIN tempData b ON a.Name = b.Name
您可以使用由JW创build的SQL小提琴作为游乐场
此线程的标题询问如何在更新中使用子查询。 这是一个例子:
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