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

Nar*_*Pal 65 sql t-sql sql-server sql-update

我有一个简单的表格结构如下:

tempData

????????????????????
?   NAME   ? MARKS ?
????????????????????
? Narendra ?    80 ?
? Ravi     ?    85 ?
? Sanjay   ?    90 ?
????????????????????
Run Code Online (Sandbox Code Playgroud)

而且我还有另一个表名为tempDataView,就像这样

????????????????????
?   NAME   ? MARKS ?
????????????????????
? Narendra ?       ?
? Narendra ?       ?
? Narendra ?       ?
? Narendra ?       ?
? Ravi     ?       ?
? Ravi     ?       ?
? Sanjay   ?       ?
????????????????????
Run Code Online (Sandbox Code Playgroud)

我想更新表tempDataView,通过设置标志 根据tempDataView - 名称相比的TempData - 名称

是的,让我告诉你我尝试了什么,我试图用Cursor解决这个问题,并且它完美地解决了,但我找到了使用Subquery解决它的方法

这里是:

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
Run Code Online (Sandbox Code Playgroud)

实际上,这就像我使用Subquery解决它的功课.

Joh*_*Woo 141

您甚至可以在UPDATE声明中加入两个表格,

UPDATE  a
SET     a.marks = b.marks
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name
Run Code Online (Sandbox Code Playgroud)

为了提高性能,请在两个表上定义一个INDEXon列marks.

运用 SUBQUERY

UPDATE  tempDataView 
SET     marks = 
        (
          SELECT marks 
          FROM tempData b 
          WHERE tempDataView.Name = b.Name
        )
Run Code Online (Sandbox Code Playgroud)

  • 单独尝试子查询并调整它,直到只得到 1 个结果。可能将“SELECT”更改为“SELECT TOP 1” (2认同)

cha*_*cha 29

因为你刚刚学习我建议你练习将SELECT连接转换为UPDATE或DELETE连接.首先,我建议您生成一个连接这两个表的SELECT语句:

SELECT *
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name
Run Code Online (Sandbox Code Playgroud)

然后请注意我们有两个表别名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
Run Code Online (Sandbox Code Playgroud)

现在,要将语句转换为DELETE语句,请使用相同的方法.以下语句将a仅删除(保留b完整)那些按名称匹配的记录:

DELETE a
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name
Run Code Online (Sandbox Code Playgroud)

您可以将JW创建的SQL Fiddle用作游乐场

  • 正确的学习方式.+1表示学习的方式.谢谢 (5认同)

小智 7

在我的示例中,我找到了解决方案,因为我在更新和子查询方面遇到了同样的问题:

UPDATE
    A
SET
    A.ValueToChange = B.NewValue
FROM
    (
        Select * From C
    ) B
Where 
    A.Id = B.Id
Run Code Online (Sandbox Code Playgroud)

  • 谢谢您的回答!为了帮助其他人阅读本文,您能否快速添加解释为什么这段代码可以解决问题? (2认同)