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


12 Answers

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;
Question

SQL Server 에서는 SELECT 문을 사용하여 테이블에 insert 할 수 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



다음 예에서는 FROM 절 뒤에있는 SELECT 문인 파생 테이블을 사용하여 추가 업데이트를 위해 이전 값과 새 값을 반환합니다.

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



아직 언급되지 않은 또 다른 가능성은 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 구문과 동일한 제한 사항이 있습니다. 소스 테이블이 일대 다 (one to many) 조인의 여러 측면에있는 경우 일치 가능한 조인 된 레코드 중 어떤 것이 Update 에서 사용되는지 MERGE 가 오류를 제기하여 피할 수있는 문제점 한 번 이상 같은 행).




SQL Server 대신 MySQL 을 사용하는 경우 구문은 다음과 같습니다.

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



나는 다음에 대한 로빈의 탁월한 대답을 수정할 것이다.

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 절이 없으면 실제로 영향을받지 않아야하는 인덱스 재 계산 또는 실행 트리거를 유발할 수있는 영향을받지 않는 행까지 영향을 미칩니다.




이것은 업데이트를 수행하는 틈새 이유 (예 : 주로 프로 시저에서 사용)이거나 다른 사람에게 분명 할 수 있지만 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



별칭 사용 :

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



SQL Server를 사용하는 경우 조인을 지정하지 않고 다른 테이블에서 한 테이블을 업데이트하고 where 절에서 두 테이블을 간단히 연결할 수 있습니다. 이것은 훨씬 간단한 SQL 쿼리를 만든다.

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



더 짧은 방법이 있으며 많은 사람들에게 놀라운 방법입니다.

-- Sample data:
---------------------------------------------------------------------------
CREATE TABLE #SOURCE ([ID] INT, [Desc] VARCHAR(10));
CREATE TABLE #DESTINATION ([ID] INT, [Desc] VARCHAR(10))

INSERT INTO #SOURCE VALUES(1,'Desc_1'), (2, 'Desc_2'), (3, 'Desc_3');
INSERT INTO #DESTINATION VALUES(1,'Desc_4'), (2, 'Desc_5'), (3, 'Desc_6');
---------------------------------------------------------------------------
UPDATE #DESTINATION
SET #DESTINATION.[Desc] = #SOURCE.[Desc]
FROM #SOURCE
WHERE #DESTINATION.[ID] = #SOURCE.[ID]
AND #Source.[Desc] = 'Desc_2'



The other way to update from select statement :

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'



SQL 데이터베이스에서 INNER JOIN을 사용하여 SELECT에서 UPDATE

이 게시물에 대한 응답이 너무 많아서 가장 많이 투표를 한 적이 있기 때문에 여기에 내 제안을 제공 할 것이라고 생각했습니다. 질문이 매우 흥미 롭긴하지만 많은 포럼 사이트에서 보았으며 스크린 샷으로 INNER JOIN 을 사용하는 솔루션을 만들었습니다.

처음에는 schoolold 라는 이름의 테이블을 만들고 열 이름과 관련하여 레코드를 거의 삽입하지 않고 실행했습니다.

그런 다음 삽입 된 레코드를 보려면 SELECT 명령을 실행했습니다.

그런 다음 나는 schoolnew 라는 이름의 새 테이블을 만들었고 위의 작업도 비슷하게 실행되었습니다.

그런 다음 삽입 된 레코드를 보려면 SELECT 명령을 실행합니다.

이제, 세 번째와 네 번째 행에서 몇 가지 변경 작업을 수행하기 위해이 작업을 완료하기 위해 INNER JOIN을 사용 하여 UPDATE 명령을 실행합니다.

변경 사항을 보려면 SELECT 명령을 실행합니다.

INNER JOIN을 UPDATE 문과 함께 사용하여 table schoolold 의 세 번째와 네 번째 레코드가 어떻게 쉽게 학교 새 학년으로 대체되었는지 볼 수 있습니다.




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



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



Related