[sql] SQL Server의 SELECT에서 어떻게 업데이트합니까?

에서 SQL 서버 , 그것은 할 수 있습니다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



답변

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'


답변

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;


답변

UPDATE YourTable
SET Col1 = OtherTable.Col1,
    Col2 = OtherTable.Col2
FROM (
    SELECT ID, Col1, Col2
    FROM other_table) AS OtherTable
WHERE
    OtherTable.ID = YourTable.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 t
SET t.col1 = o.col1,
    t.col2 = o.col2
FROM
    other_table o
  JOIN
    t ON t.id = o.id
WHERE
    o.sql = 'cool'


답변

아직 언급되지 않은 또 다른 가능성은 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다른 답변 중 네 가지에 표시된 독점 구문 과 동일한 제한 사항이 있습니다 . 소스 테이블이 일대의 여러 측면에있는 경우는 가능한 한 일치의 레코드가 사용됩니다 합류하는 결정적 (undeterministic)입니다 다음에 가입 Update하는 (문제가 MERGE피할 수를 갱신하려는 시도가있을 경우 오류를 높여 같은 행을 두 번 이상).


답변

레코드 (및 내가 검색 한 다른 사람들)를 위해 MySQL에서 다음과 같이 할 수 있습니다.

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