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
최근댓글