在 SQL Server 中,可以使用 SELECT
语句将 insert
放入表中:
INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3
FROM other_table
WHERE sql = 'cool'
是否也可以通过 SELECT
进行更新?我有一个包含值的临时表,并希望使用这些值更新另一个表 . 也许是这样的:
UPDATE Table SET col1, col2
SELECT col1, col2
FROM other_table
WHERE sql = 'cool'
WHERE Table.id = other_table.id
30 回答
简单的方法是:
以下示例使用派生表(FROM子句后面的SELECT语句)返回旧值和新值以进行进一步更新:
通过
CTE
更新比其他答案更具可读性:我将Robin's excellent answer修改为以下内容:
如果没有WHERE子句,您甚至会影响不需要受影响的行,这可能(可能)导致索引重新计算或实际上不应该触发的触发器 .
如果您使用的是SQL Server,则可以在不指定连接的情况下从另一个表更新一个表,只需将这两个表从
where
子句链接即可 . 这使得SQL查询更加简单:要确保更新所需内容,请先选择
像这样;但你必须确保更新表和表后相同 .
这是另一个有用的语法:
它使用“WHERE EXIST”检查它是否为null .
使用别名:
在这里整合所有不同的方法 .
选择更新
使用公用表表达式进行更新
合并
示例表结构如下,并将从Product_BAK更新为Product表 .
产品
Product_BAK
1.选择更新
2.使用公用表表达式进行更新
3.合并
在Merge语句中,如果没有在目标中找到匹配的记录,我们可以进行插入,但是在源代码中存在并且请找到语法:
对于记录(以及其他像我一样的搜索),你可以在MySQL中这样做:
另一种未提及的可能性是将
SELECT
语句本身放入CTE然后更新CTE .这样做的好处是可以很容易地首先运行
SELECT
语句来检查结果,但是如果在源表和目标表中它们的名称相同,它确实要求您对列进行别名 .这也与其他四个答案中显示的专有
UPDATE ... FROM
语法具有相同的限制 . 如果源表位于一对多连接的许多一侧,则不确定哪些可能的匹配连接记录将在Update
中使用(如果尝试尝试,则通过引发错误来避免MERGE
的问题不止一次更新同一行) .从select语句更新的另一种方法:
单程
在SQL Server 2008(或更高版本)中,使用MERGE
或者:
这可能是执行更新的一个利基理由(例如,主要用于过程),或者对其他人来说可能是显而易见的,但是还应该声明您可以在不使用连接的情况下执行update-select语句(如果是您正在更新的表没有公共字段) .
使用:
无论是:
要么:
如果两个表中的ID列名相同,则只需将表名放在要更新的表之前,并使用所选表的别名,即:
如果你想加入自己的表(这不会经常发生):
我只是添加了这个,所以你可以看到一个快速的方法来编写它,以便你可以检查在更新之前将更新的内容 .
如果使用MySQL而不是SQL Server,则语法为:
在接受的答案中,在:
我想补充一下:
我通常做的是将所有内容放在一个支持滚动的事务中并使用
"OUTPUT"
:这样我就能看到即将发生的一切 . 当我对所看到的内容感到满意时,我将ROLLBACK
更改为COMMIT
.我通常需要记录我所做的事情,因此在运行roll-backed查询时我使用
"results to Text"
选项,并保存脚本和OUTPUT的结果 . (当然,如果我改变太多行,这是不切实际的)UPDATE from SELECT with INNER JOIN in SQL Database
由于这篇文章的回复太多,而且投票率最高,我想我也会在这里提出我的建议 . 虽然这个问题非常有趣,但我在许多论坛网站上都看到了并使用 INNER JOIN 制作了截图解决方案 .
首先,我创建了一个名为 schoolold 的表,并插入了几个与其列名相关的记录并执行它 .
然后我执行了 SELECT 命令来查看插入的记录 .
然后我创建了一个名为 schoolnew 的新表,并且类似地执行了以上行动 .
然后,要在其中查看插入的记录,我执行SELECT命令 .
现在,我想在第三和第四行做一些更改,为了完成这个动作,我用 INNER JOIN 执行 UPDATE 命令 .
要查看更改,请执行 SELECT 命令 .
您可以通过使用带有UPDATE语句的INNER JOIN来查看表 schoolold 的第三条和第四条记录如何通过表 schoolnew 轻松替换 .
另一种方法是使用派生表:
样本数据
以下解决方案适用于MySQL数据库:
甚至有一个 shorter method ,你可能会感到惊讶:
样本数据集:
码:
您可以在此处使用sql server中的更新