我有这样一个简单的表结构:
表的TempData
╔══════════╦═══════╗
║ NAME ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║ 80 ║
║ Ravi ║ 85 ║
║ Sanjay ║ 90 ║
╚══════════╩═══════╝
我也有这样的另一个表名作为tempDataView
╔══════════╦═══════╗
║ NAME ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║ ║
║ Narendra ║ ║
║ Narendra ║ ║
║ Narendra ║ ║
║ Ravi ║ ║
║ Ravi ║ ║
║ Sanjay ║ ║
╚══════════╩═══════╝
我想更新表tempDataView,通过根据tempDataView设置标记 - 名称 - 姓名与TempData的比较
是的,让我告诉你我想,我想这使用光标和它完美的解决了,但我发现使用子查询来解决它的办法来解决
这里是:
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
为更快的性能,定义一个INDEX
上列marks
两个表。
使用SUBQUERY
UPDATE tempDataView
SET marks =
(
SELECT marks
FROM tempData b
WHERE tempDataView.Name = b.Name
)
因为你刚开始学习,我建议你练转换SELECT加入更新或删除连接。 首先,我建议你生成一个SELECT语句中加入这两个表:
SELECT *
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
然后注意,我们有两个表的别名a
和b
。 使用这些别名,你可以轻松地生成UPDATE语句更新两个表中的a或b。 对于表必须由JW给出了一个答案。 如果您想更新b
,该语句将是:
UPDATE b
SET b.marks = a.marks
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
现在,该语句转换为DELETE语句使用同样的方法。 下面的语句将删除a
只(将b完好)对于那些名称相匹配的记录:
DELETE a
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
您可以使用JW创建为一个操场SQL小提琴
The title of this thread asks how a subquery can be used in an update. Here's an example of that:
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
这里是更新操作的一些例子一个很好的解释。 虽然这是Postgres的网站,但SQL查询的有效期为其他数据块,太。 下面的例子是直观明了。
-- Update contact names in an accounts table to match the currently assigned salesmen:
UPDATE accounts SET (contact_first_name, contact_last_name) =
(SELECT first_name, last_name FROM salesmen
WHERE salesmen.id = accounts.sales_id);
-- A similar result could be accomplished with a join:
UPDATE accounts SET contact_first_name = first_name,
contact_last_name = last_name
FROM salesmen WHERE salesmen.id = accounts.sales_id;
然而,第二个查询可能会产生意外的结果,如果salesmen.id不是唯一的关键,而第一查询保证,如果有多个ID匹配引发错误。 另外,如果没有匹配特定accounts.sales_id项,第一个查询将设置相应的名称字段设置为null,而第二个查询不会在所有更新这一行。
因此,对于给定的例子,最可靠的查询是像下面这样。
UPDATE tempDataView SET (marks) =
(SELECT marks FROM tempData
WHERE tempDataView.Name = tempData.Name);