如何从SQL Server的SELECT中进行UPDATE?
在SQL Server中,可以使用 "SELECT "语句来 "插入 "一个表。
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
3522
20
在SQL Server 2008(或更高版本)中,使用
MERGE
或者说:
我想把罗宾的出色回答修改为以下内容。
如果没有WHERE子句,你甚至会影响那些不需要被影响的记录,这(可能)会导致索引重新计算或触发那些真正不应该被触发的触发器。
单程
另一种尚未提及的可能性是将
SELECT
语句本身夹在CTE中,然后更新CTE。这样做的好处是,可以很容易地先单独运行
SELECT
语句来对结果进行理智检查,但如果源表和目标表中的列的名称相同,则需要如上所述对它们进行别名。这也和专有的
UPDATE .... FROM
语法一样的限制。 如果源表在一对多连接的多面,那么在 "Update "中就无法确定哪条可能匹配的连接记录将被使用(如果试图多次更新同一行,"MERGE "通过引发错误来避免这个问题)。郑重声明(和其他像我一样搜索的人),你可以在MySQL中这样做。
使用别名。
简单的方法就是。
这可能是执行更新的一个小众理由(例如,主要用于存储过程),或者对其他人来说可能是显而易见的,但也应该说明,你可以在不使用join的情况下执行更新-选择语句(以防你'更新的表之间没有共同的字段)。
下面是另一种有用的语法。
它通过使用"WHERE EXIST"检查是否为空。
我加这个只是为了让你看到一个快速的写法,以便你在做更新之前可以检查一下要更新的内容。
如果使用[MySQL][1]而不是SQL Server,则语法为:{{6623252}}}。
[1]: http://en.wikipedia.org/wiki/MySQL
在SQL数据库中用INNER JOIN从SELECT更新。
由于这个帖子的回复太多,其中上票最多,我想在这里也提供一下我的建议。 虽然这个问题很有意思,但我在很多论坛网站上都看到了,并且用INNER JOIN做了一个解决方案,并附上截图。
一开始,我创建了一个名为schoolold的表,并根据列名插入了几条记录,然后执行它。
然后我执行SELECT命令来查看插入的记录。
[![][1]][1]
然后我创建了一个名为schoolnew的新表,并同样执行了上述操作。
[![][2]][2]
然后,为了查看其中插入的记录,我执行SELECT命令。
[![][3]][3]
现在,我想在第三行和第四行做一些修改,为了完成这个操作,我执行UPDATE命令和INNER JOIN。
[![][4]][4]
为了查看变化,我执行SELECT命令。
[1]: http://i.stack.imgur.com/OdtDP.png [2]: http://i.stack.imgur.com/QP7Fw.png [3]: http://i.stack.imgur.com/BfqC5.png [4]: http://i.stack.imgur.com/agP7W.png 5:
你可以看到通过使用INNER JOIN和UPDATE语句,表schoolold的第三和第四条记录如何轻松地被表schoolnew替换。
下面的例子使用派生表,即在FROM子句后使用SELECT语句,返回旧值和新值,以便进一步更新。
如果你想把表和自己连接起来(这不会太经常发生)。
通过 "CTE "更新,比这里的其他答案更有可读性。
如果你使用的是SQL Server,你可以从另一个表中更新一个表,而不需要指定连接,只需要从 "where "子句将两个表连接起来。 这使得SQL查询更加简单。
另一种方法是使用派生表。
样本数据
要确保你正在更新你想要的东西,首先选择