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


질문

 

SQL Server에서는 삽입이있는 테이블에 행을 삽입 할 수 있습니다 .. SELECT 문 :

INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3 
FROM other_table 
WHERE sql = 'cool'

선택을 사용하여 테이블을 업데이트하는 것도 가능합니까?값이 포함 된 임시 테이블이 있으며 해당 값을 사용하여 다른 테이블을 업데이트하고 싶습니다.아마도 이와 같은 것 :

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 (또는 Newer)에서 병합을 사용하십시오.

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 문을 자신의 처음으로 실행하는 것이 쉽지 않은 이점이 있지만 결과를 확인하는 것이지만 원본 및 대상 테이블에서 동일한 이름이 지정된 경우 위의 열을 별칭을 요구합니다.

이것은 또한 독점 업데이트와 동일한 제한을 가지고 있습니다 ... 다른 답변의 네 가지에 표시된 구문으로부터.소스 테이블이 일대 다 가입의 여러면에있는 경우, 가능한 일치하는 일치하는 기록 중 어느 것이 업데이트에 사용될 수있는 문제가 발생하는 문제가 오류를 발생시킴으로써 오류를 발생시킴으로써 피해야 할 문제가 발생하는 문제가 발생합니다.같은 행을 두 번 이상 업데이트하십시오).

출처:https://stackoverflow.com/questions/2334712/how-do-i-update-from-a-select-in-sql-server