update用法 - update時間sql




如何從SQL Server中的SELECT更新? (20)

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

  1. 使用內部聯接

更新SET A.col1 = B.col1,A.col2 = B.col2 FROM Some_Table AS A INNER JOIN Other_Table AS B ON A.id = B.id WHERE A.col3 ='cool'

  1. Co相關的子查詢

UPDATE表SET Col1 = B.Col1,Col2 = B.Col2 FROM(SELECT ID,Col1,Col2 FROM other_table)B WHERE B.ID = table.ID


在SQL數據庫中使用INNER JOIN從SELECT更新

由於這篇文章的回复太多,而且投票率最高,我想我也會在這裡提出我的建議。 雖然這個問題非常有趣,但我在許多論壇網站上都看到過,並使用INNER JOIN和截圖進行了解決方案。

首先,我創建了一個以schoolold命名的表,並插入了幾個與其列名相關的記錄並執行它。

然後我執行SELECT命令來查看插入的記錄。

然後我創建了一個以schoolnew命名的新表,並且類似地執行了上面的操作。

然後,要在其中查看插入的記錄,我執行SELECT命令。

現在,我想在第三和第四行進行一些更改,為了完成此操作,我使用INNER JOIN執行UPDATE命令。

要查看更改,我執行SELECT命令。

通過使用帶有UPDATE語句的INNER JOIN,您可以看到表schoolold的第三和第四條記錄如何通過tablenewnew輕鬆替換。


以下解決方案適用於MySQL數據庫:

UPDATE table1 a , table2 b 
SET a.columname = 'some value' 
WHERE b.columnname IS NULL ;

使用別名:

UPDATE t
   SET t.col1 = o.col1
  FROM table1 AS t
         INNER JOIN 
       table2 AS o 
         ON t.id = o.id

另一種方法是使用派生表:

UPDATE t
SET t.col1 = a.col1
    ,t.col2 = a.col2
FROM (
SELECT id, col1, col2 FROM @tbl2) a
INNER JOIN @tbl1 t ON t.id = a.id

樣本數據

DECLARE @tbl1 TABLE (id INT, col1 VARCHAR(10), col2 VARCHAR(10))
DECLARE @tbl2 TABLE (id INT, col1 VARCHAR(10), col2 VARCHAR(10))

INSERT @tbl1 SELECT 1, 'a', 'b' UNION SELECT 2, 'b', 'c'

INSERT @tbl2 SELECT 1, '1', '2' UNION SELECT 2, '3', '4'

UPDATE t
SET t.col1 = a.col1
    ,t.col2 = a.col2
FROM (
SELECT id, col1, col2 FROM @tbl2) a
INNER JOIN @tbl1 t ON t.id = a.id

SELECT * FROM @tbl1
SELECT * FROM @tbl2

另一種未提及的可能性是將SELECT語句本身放入CTE然後更新CTE。

;WITH CTE
     AS (SELECT T1.Col1,
                T2.Col1 AS _Col1,
                T1.Col2,
                T2.Col2 AS _Col2
         FROM   T1
                JOIN T2
                  ON T1.id = T2.id
         /*Where clause added to exclude rows that are the same in both tables
           Handles NULL values correctly*/
         WHERE EXISTS(SELECT T1.Col1,
                             T1.Col2
                       EXCEPT
                       SELECT T2.Col1,
                              T2.Col2))
UPDATE CTE
SET    Col1 = _Col1,
       Col2 = _Col2

這樣做的好處是,可以很容易地自己運行SELECT語句,以便對結果進行完整性檢查,但如果在源表和目標表中將列命名為相同,則確實需要對列進行別名。

這也與其他四個答案中顯示的專有UPDATE ... FROM語法具有相同的限制。 如果源表位於一對多連接的許多一側,則不確定哪些可能的匹配連接記錄將在UpdateMERGE通過引發錯誤而避免的問題,如果有嘗試不止一次更新同一行)。


在SQL Server 2008(或更高版本)中,使用MERGE

MERGE INTO YourTable T
   USING other_table S 
      ON T.id = S.id
         AND S.tsql = 'cool'
WHEN MATCHED THEN
   UPDATE 
      SET col1 = S.col1, 
          col2 = S.col2;

或者:

MERGE INTO YourTable T
   USING (
          SELECT id, col1, col2 
            FROM other_table 
           WHERE tsql = 'cool'
         ) S
      ON T.id = S.id
WHEN MATCHED THEN
   UPDATE 
      SET col1 = S.col1, 
          col2 = S.col2;

在接受的答案中,在:

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

我想補充一下:

OUTPUT deleted.*, inserted.*

我通常做的是將所有內容放在一個支持滾動的事務中並使用"OUTPUT" :這樣我就能看到即將發生的一切。 當我對所看到的內容感到滿意時,我將ROLLBACK更改為COMMIT

我通常需要記錄我所做的事情,所以當我運行roll-backed查詢時,我使用"results to Text"選項,我保存了腳本和OUTPUT的結果。 (當然,如果我改變太多行,這是不切實際的)


如果你想加入自己的表(這不會經常發生):

update t1                    -- just reference table alias here
set t1.somevalue = t2.somevalue
from table1 t1               -- these rows will be the targets
inner join table1 t2         -- these rows will be used as source
on ..................        -- the join clause is whatever suits you

如果您使用MySQL而不是SQL Server,則語法為:

UPDATE Table1
INNER JOIN Table2
ON Table1.id = Table2.id
SET Table1.col1 = Table2.col1,
    Table1.col2 = Table2.col2

對於記錄(以及其他像我一樣的搜索),你可以在MySQL中這樣做:

UPDATE first_table, second_table
SET first_table.color = second_table.color
WHERE first_table.id = second_table.foreign_id

從select語句更新的另一種方法:

UPDATE A
SET A.col = A.col,B.col1 = B.col1
FROM  first_Table AS A
INNER JOIN second_Table AS B  ON A.id = B.id WHERE A.col2 = 'cool'

我只是添加了這個,所以你可以看到一個快速的方法來編寫它,以便你可以檢查在更新之前將更新的內容。

UPDATE Table 
SET  Table.col1 = other_table.col1,
     Table.col2 = other_table.col2 
--select Table.col1, other_table.col,Table.col2,other_table.col2, *   
FROM     Table 
INNER JOIN     other_table 
    ON     Table.id = other_table.id 

我會修改Robin對以下內容的出色答案

UPDATE Table
SET Table.col1 = other_table.col1,
 Table.col2 = other_table.col2
FROM
    Table
INNER JOIN other_table ON Table.id = other_table.id
WHERE
    Table.col1 != other_table.col1
OR Table.col2 != other_table.col2
OR (
    other_table.col1 IS NOT NULL
    AND Table.col1 IS NULL
)
OR (
    other_table.col2 IS NOT NULL
    AND Table.col2 IS NULL
)

如果沒有WHERE子句,您甚至會影響不需要受影響的行,這可能(可能)導致索引重新計算或實際上不應該觸發的觸發器。


簡單的方法是:

UPDATE
    table_to_update,
    table_info
SET
    table_to_update.col1 = table_info.col1,
    table_to_update.col2 = table_info.col2

WHERE
    table_to_update.ID = table_info.ID

這可能是執行更新的一個利基理由(例如,主要用於過程),或者對其他人來說可能是顯而易見的,但是還應該聲明您可以在不使用連接的情況下執行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

通過CTE更新比其他答案更具可讀性:

UPDATE Table1
SET Table1.col1 = Table2.col1,
    Table1.col2 = Table2.col2
FROM
    Table2
WHERE
    Table1.id = Table2.id

UPDATE
    Table_A
SET
    Table_A.col1 = Table_B.col1,
    Table_A.col2 = Table_B.col2
FROM
    Some_Table AS Table_A
    INNER JOIN Other_Table AS Table_B
        ON Table_A.id = Table_B.id
WHERE
    Table_A.col3 = 'cool'

UPDATE table 
SET Col1 = i.Col1, 
    Col2 = i.Col2 
FROM (
    SELECT ID, Col1, Col2 
    FROM other_table) i
WHERE 
    i.ID = table.ID

UPDATE table AS a
INNER JOIN table2 AS b
ON a.col1 = b.col1
INNER JOIN ... AS ...
ON ... = ...
SET ...
WHERE ...






select