在Sql Server中使用子查询更新查询

我有一个简单的表结构像这样:

tempData

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

而我也有这样的另一个表名tempDataView

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

我想通过设置标记根据tempDataViewNametempDataName比较来更新表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 

然后请注意,我们有两个表别名ab 。 使用这些别名可以轻松生成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