在SQL Server中,可以使用insert将行插入到表中。。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

当前回答

在接受的答案中,在以下内容之后:

SET
Table_A.col1 = Table_B.col1,
Table_A.col2 = Table_B.col2

我想补充一句:

OUTPUT deleted.*, inserted.*

我通常做的是将所有内容放入回滚事务中,并使用“OUTPUT”:这样我就可以看到即将发生的一切。当我对所看到的感到满意时,我将ROLLBACK更改为COMMIT。

我通常需要记录我所做的事情,所以我在运行回滚查询时使用“results to Text”选项,并保存脚本和OUTPUT的结果。(当然,如果我更改了太多行,这是不可行的)

其他回答

这可能是执行更新的一个特殊原因(例如,主要在过程中使用),也可能对其他人来说是显而易见的,但也应该指出,您可以在不使用join的情况下执行update select语句(如果您正在更新的表之间没有公共字段)。

update
    Table
set
    Table.example = a.value
from
    TableExample a
where
    Table.field = *key value* -- finds the row in Table 
    AND a.field = *key value* -- finds the row in TableExample a

同样的解决方案可以用稍微不同的方式编写,因为我只想设置一次列。这两张桌子我都写过了。它在MySQL中工作。

UPDATE Table t,
(SELECT col1, col2 FROM other_table WHERE sql = 'cool' ) o
SET t.col1 = o.col1, t.col2=o.col2
WHERE t.id = o.id
UPDATE TQ
SET TQ.IsProcessed = 1, TQ.TextName = 'bla bla bla'
FROM TableQueue TQ
INNER JOIN TableComment TC ON TC.ID = TQ.TCID
WHERE TQ.IsProcessed = 0

要确保正在更新所需内容,请先选择

SELECT TQ.IsProcessed, 1 AS NewValue1, TQ.TextName, 'bla bla bla' AS NewValue2
FROM TableQueue TQ
INNER JOIN TableComment TC ON TC.ID = TQ.TCID
WHERE TQ.IsProcessed = 0

最佳实践:更新行并保存在公司使用的SQL Server中

 WITH t AS
         (
           SELECT UserID, EmailAddress, Password, Gender, DOB, Location,
           Active  FROM Facebook.Users
         )
 UPDATE t SET Active = 0

这是更新记录的最安全的方式,这是您可以看到我们将要更新的内容的方式。来源:URL

像其他人一样,必须指出MySQL或MariaDB使用不同的语法。它还支持非常方便的USING语法(与T/SQL相反)。INNER JOIN也是JOIN的同义词。因此,原始问题中的查询最好在MySQL中实现:

UPDATE
    Some_Table AS Table_A

JOIN
    Other_Table AS Table_B USING(id)

SET
    Table_A.col1 = Table_B.col1,
    Table_A.col2 = Table_B.col2

WHERE
    Table_A.col3 = 'cool'

我在其他答案中没有看到问题的答案,因此我的两分钱。(在PHP 7.4.0 MariaDB 10.4.10上测试)