使用子查询在SQL服务器更新查询(Update query using Subquery in Sq

2019-07-19 01:14发布

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

的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

其实这就像对我来说,使用子查询解决问题的功课。

Answer 1:

你可以加入这两个表甚至UPDATE语句,

UPDATE  a
SET     a.marks = b.marks
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name
  • SQLFiddle演示

为更快的性能,定义一个INDEX上列marks两个表。

使用SUBQUERY

UPDATE  tempDataView 
SET     marks = 
        (
          SELECT marks 
          FROM tempData b 
          WHERE tempDataView.Name = b.Name
        )
  • SQLFiddle演示


Answer 2:

因为你刚开始学习,我建议你练转换SELECT加入更新或删除连接。 首先,我建议你生成一个SELECT语句中加入这两个表:

SELECT *
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name

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



Answer 3:

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


Answer 4:

这里是更新操作的一些例子一个很好的解释。 虽然这是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);


文章来源: Update query using Subquery in Sql Server