에서 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