Как мне обновить с SELECT в SQL Server? - PullRequest
3399 голосов
/ 25 февраля 2010

В 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

Ответы [ 33 ]

52 голосов
/ 02 мая 2013

Вот еще один полезный синтаксис:

UPDATE suppliers
SET supplier_name = (SELECT customers.name
                     FROM customers
                     WHERE customers.customer_id = suppliers.supplier_id)
WHERE EXISTS (SELECT customers.name
              FROM customers
              WHERE customers.customer_id = suppliers.supplier_id);

Он проверяет, является ли он нулевым или нет, используя "WHERE EXIST".

48 голосов
/ 09 сентября 2011

Я добавляю это только для того, чтобы вы могли увидеть быстрый способ написать это, чтобы вы могли проверить, что будет обновлено, прежде чем делать обновление.

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 
46 голосов
/ 03 октября 2013

Если вы используете MySQL вместо SQL Server, синтаксис будет:

UPDATE Table1
INNER JOIN Table2
ON Table1.id = Table2.id
SET Table1.col1 = Table2.col1,
    Table1.col2 = Table2.col2
46 голосов
/ 30 ноября 2015

ОБНОВЛЕНИЕ из SELECT с ВНУТРЕННИМ СОЕДИНЕНИЕМ в базе данных SQL

Поскольку в этом посте слишком много ответов, за которые проголосовали наиболее активно, я подумал, что я тоже приведу свое предложение здесь. Хотя вопрос очень интересный, я видел его на многих форумах и нашел решение, используя INNER JOIN со скриншотами.

Сначала я создал таблицу с именем schoolold , вставил несколько записей относительно имен столбцов и выполнил ее.

Затем я выполнил команду SELECT для просмотра вставленных записей.

Затем я создал новую таблицу с именем schoolnew и выполнил аналогичные действия над ней.

Затем для просмотра вставленных в него записей я выполняю команду SELECT.

Теперь я хочу внести некоторые изменения в третью и четвертую строку, чтобы выполнить это действие, я выполняю команду UPDATE с INNER JOIN .

Для просмотра изменений я выполняю команду SELECT .

Вы можете увидеть, как третья и четвертая записи таблицы schoolold легко заменяются таблицей schoolnew с помощью оператора INNER JOIN с оператором UPDATE.

37 голосов
/ 25 сентября 2013

В следующем примере используется производная таблица, оператор SELECT после предложения FROM, для возврата старых и новых значений для дальнейших обновлений:

UPDATE x
SET    x.col1 = x.newCol1,
       x.col2 = x.newCol2
FROM   (SELECT t.col1,
               t2.col1 AS newCol1,
               t.col2,
               t2.col2 AS newCol2
        FROM   [table] t
               JOIN other_table t2
                 ON t.ID = t2.ID) x
37 голосов
/ 28 июня 2014

А если вы хотите присоединиться к столу с самим собой (что случается не часто):

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
34 голосов
/ 12 декабря 2015

Обновление через CTE более читабельно, чем другие ответы здесь:

;WITH cte
     AS (SELECT col1,col2,id
         FROM   other_table
         WHERE  sql = 'cool')
UPDATE A
SET    A.col1 = B.col1,
       A.col2 = B.col2
FROM   table A
       INNER JOIN cte B
               ON A.id = B.id
33 голосов
/ 20 февраля 2017

Если вы используете SQL Server, вы можете обновить одну таблицу из другой, не указывая соединение, и просто связать две таблицы из предложения where. Это делает намного более простой запрос SQL:

UPDATE Table1
SET Table1.col1 = Table2.col1,
    Table1.col2 = Table2.col2
FROM
    Table2
WHERE
    Table1.id = Table2.id
20 голосов
/ 01 декабря 2016
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
20 голосов
/ 25 февраля 2016

Другой способ - использовать производную таблицу:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...