질문자 :jamesmhaley
SQL Server 에서는 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
답변자 : Robin Day
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'
답변자 : onedaywhen
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;
답변자 : Jamal
UPDATE YourTable SET Col1 = OtherTable.Col1, Col2 = OtherTable.Col2 FROM ( SELECT ID, Col1, Col2 FROM other_table) AS OtherTable WHERE OtherTable.ID = YourTable.ID
답변자 : quillbreaker
나는 다음에 대한 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 절이 없으면 영향을 받을 필요가 없는 행에도 영향을 미치며, 이는 (아마도) 인덱스 재계산을 일으키거나 실제로 실행되어서는 안 되는 트리거를 발생시킬 수 있습니다.
답변자 : SQLMenace
일방 통행
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'
답변자 : Martin Smith
아직 언급되지 않은 또 다른 가능성은 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
구문과 동일한 제한이 있습니다. 소스 테이블이 일대다 조인의 여러 쪽에 있는 경우 가능한 일치하는 조인 레코드 중 Update
MERGE
합니다(MERGE가 같은 행을 두 번 이상 업데이트).
답변자 : Adrian Macneil
기록(그리고 나처럼 검색하는 다른 사람들)의 경우 MySQL에서 다음과 같이 할 수 있습니다.
UPDATE first_table, second_table SET first_table.color = second_table.color WHERE first_table.id = second_table.foreign_id
답변자 : rageit
별칭 사용:
UPDATE t SET t.col1 = o.col1 FROM table1 AS t INNER JOIN table2 AS o ON t.id = o.id
답변자 : Patrick Frenette
간단한 방법은 다음과 같습니다.
UPDATE table_to_update, table_info SET table_to_update.col1 = table_info.col1, table_to_update.col2 = table_info.col2 WHERE table_to_update.ID = table_info.ID
답변자 : Ryan
이것은 업데이트를 수행하는 틈새 이유(예: 주로 프로시저에서 사용됨)이거나 다른 사람들에게 명백할 수 있지만 조인을 사용하지 않고 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
답변자 : efirat
다음은 또 다른 유용한 구문입니다.
UPDATE suppliers SET supplier_name = (SELECT customers.name FROM customers WHERE customers.customer_id = suppliers.supplier_id) WHERE EXISTS (SELECT customers.name FROM customers WHERE customers.customer_id = suppliers.supplier_id);
"WHERE EXIST"를 사용하여 null 여부를 확인합니다.
답변자 : HLGEM
업데이트를 수행하기 전에 업데이트될 내용을 확인할 수 있도록 작성하는 빠른 방법을 볼 수 있도록 이 항목만 추가합니다.
UPDATE Table SET Table.col1 = other_table.col1, Table.col2 = other_table.col2 --select Table.col1, other_table.col,Table.col2,other_table.col2, * FROM Table INNER JOIN other_table ON Table.id = other_table.id
답변자 : Hentold
SQL Server 대신 MySQL 을 사용하는 경우 구문은 다음과 같습니다.
UPDATE Table1 INNER JOIN Table2 ON Table1.id = Table2.id SET Table1.col1 = Table2.col1, Table1.col2 = Table2.col2
답변자 : Jason Clark
SQL Database에서 INNER JOIN을 사용하여 SELECT에서 업데이트
이 게시물에는 가장 많이 찬성표를 받은 답글이 너무 많기 때문에 여기에도 제 제안을 드려야 겠다고 생각했습니다. 질문은 매우 흥미롭지만 많은 포럼 사이트에서 보았고 스크린샷과 함께 INNER JOIN을 사용하여 솔루션을 만들었습니다.
먼저 schoolold 라는 이름의 테이블을 만들고 열 이름과 관련하여 몇 가지 레코드를 삽입하고 실행합니다.
그런 다음 삽입된 레코드를 보기 위해 SELECT 명령을 실행했습니다.
그런 다음 schoolnew 라는 이름의 새 테이블을 만들고 위에서 작업을 유사하게 실행했습니다.
그런 다음 삽입된 레코드를 보기 위해 SELECT 명령을 실행합니다.
이제 세 번째와 네 번째 행을 변경하고 싶습니다. 이 작업을 완료하기 위해 INNER JOIN으로 UPDATE 명령을 실행합니다.
변경 사항을 보려면 SELECT 명령을 실행합니다.
INNER JOIN을 UPDATE 문과 함께 사용하면 테이블 schoolold 의 세 번째 및 네 번째 레코드가 테이블 schoolnew로 어떻게 쉽게 대체되는지 확인할 수 있습니다.
답변자 : jakubiszon
그리고 테이블 자체를 조인하려는 경우(너무 자주 발생하지는 않음):
update t1 -- just reference table alias here set t1.somevalue = t2.somevalue from table1 t1 -- these rows will be the targets inner join table1 t2 -- these rows will be used as source on .................. -- the join clause is whatever suits you
답변자 : Pரதீப்
CTE
통한 업데이트는 여기에서 다른 답변보다 읽기 쉽습니다.
;WITH cte AS (SELECT col1,col2,id FROM other_table WHERE sql = 'cool') UPDATE A SET A.col1 = B.col1, A.col2 = B.col2 FROM table A INNER JOIN cte B ON A.id = B.id
답변자 : Aleksandr Fedorenko
다음 예에서는 파생 테이블인 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
답변자 : Richard
SQL Server를 사용하는 경우 조인을 지정하지 않고 다른 테이블에서 한 테이블을 업데이트하고 where
절에서 두 테이블을 간단히 연결할 수 있습니다. 이것은 훨씬 더 간단한 SQL 쿼리를 만듭니다.
UPDATE Table1 SET Table1.col1 = Table2.col1, Table1.col2 = Table2.col2 FROM Table2 WHERE Table1.id = Table2.id
답변자 : Abdul Azeez
여기에 모든 다양한 접근 방식을 통합합니다.
- 업데이트 선택
- 공통 테이블 표현식으로 업데이트
- 병합
샘플 테이블 구조는 아래와 같으며 Product_BAK에서 Product 테이블로 업데이트됩니다.
제품
CREATE TABLE [dbo].[Product]( [Id] [int] IDENTITY(1, 1) NOT NULL, [Name] [nvarchar](100) NOT NULL, [Description] [nvarchar](100) NULL ) ON [PRIMARY]
제품_BAK
CREATE TABLE [dbo].[Product_BAK]( [Id] [int] IDENTITY(1, 1) NOT NULL, [Name] [nvarchar](100) NOT NULL, [Description] [nvarchar](100) NULL ) ON [PRIMARY]
1. 업데이트 선택
update P1 set Name = P2.Name from Product P1 inner join Product_Bak P2 on p1.id = P2.id where p1.id = 2
2. 공통 테이블 표현식으로 업데이트
; With CTE as ( select id, name from Product_Bak where id = 2 ) update P set Name = P2.name from product P inner join CTE P2 on P.id = P2.id where P2.id = 2
3. 병합
Merge into product P1 using Product_Bak P2 on P1.id = P2.id when matched then update set p1.[description] = p2.[description], p1.name = P2.Name;
이 Merge 문에서 대상에서 일치하는 레코드를 찾지 못하면 삽입을 수행할 수 있지만 소스에는 존재하고 구문을 찾으십시오.
Merge into product P1 using Product_Bak P2 on P1.id = P2.id; when matched then update set p1.[description] = p2.[description], p1.name = P2.Name; WHEN NOT MATCHED THEN insert (name, description) values(p2.name, P2.description);
답변자 : sqluser
다른 방법은 파생 테이블을 사용하는 것입니다.
UPDATE t SET t.col1 = a.col1 ,t.col2 = a.col2 FROM ( SELECT id, col1, col2 FROM @tbl2) a INNER JOIN @tbl1 t ON t.id = a.id
샘플 데이터
DECLARE @tbl1 TABLE (id INT, col1 VARCHAR(10), col2 VARCHAR(10)) DECLARE @tbl2 TABLE (id INT, col1 VARCHAR(10), col2 VARCHAR(10)) INSERT @tbl1 SELECT 1, 'a', 'b' UNION SELECT 2, 'b', 'c' INSERT @tbl2 SELECT 1, '1', '2' UNION SELECT 2, '3', '4' UPDATE t SET t.col1 = a.col1 ,t.col2 = a.col2 FROM ( SELECT id, col1, col2 FROM @tbl2) a INNER JOIN @tbl1 t ON t.id = a.id SELECT * FROM @tbl1 SELECT * FROM @tbl2
답변자 : Yaman
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
답변자 : Bartosz X
더 짧은 방법이 있으며 다음과 같이 놀랄 수 있습니다.
샘플 데이터 세트:
CREATE TABLE #SOURCE ([ID] INT, [Desc] VARCHAR(10)); CREATE TABLE #DEST ([ID] INT, [Desc] VARCHAR(10)); INSERT INTO #SOURCE VALUES(1,'Desc_1'), (2, 'Desc_2'), (3, 'Desc_3'); INSERT INTO #DEST VALUES(1,'Desc_4'), (2, 'Desc_5'), (3, 'Desc_6');
암호:
UPDATE #DEST SET #DEST.[Desc] = #SOURCE.[Desc] FROM #SOURCE WHERE #DEST.[ID] = #SOURCE.[ID];
답변자 : russ
사용하다:
drop table uno drop table dos create table uno ( uid int, col1 char(1), col2 char(2) ) create table dos ( did int, col1 char(1), col2 char(2), [sql] char(4) ) insert into uno(uid) values (1) insert into uno(uid) values (2) insert into dos values (1,'a','b',null) insert into dos values (2,'c','d','cool') select * from uno select * from dos
어느 하나:
update uno set col1 = (select col1 from dos where uid = did and [sql]='cool'), col2 = (select col2 from dos where uid = did and [sql]='cool')
또는:
update uno set col1=d.col1,col2=d.col2 from uno inner join dos d on uid=did where [sql]='cool' select * from uno select * from dos
두 테이블에서 ID 열 이름이 동일한 경우 업데이트할 테이블 앞에 테이블 이름을 넣고 선택한 테이블의 별칭을 사용합니다. 예:
update uno set col1 = (select col1 from dos d where uno.[id] = d.[id] and [sql]='cool'), col2 = (select col2 from dos d where uno.[id] = d.[id] and [sql]='cool')
답변자 : Johannes Wentu
허용 된 답변에서 다음을 수행합니다.
SET Table_A.col1 = Table_B.col1, Table_A.col2 = Table_B.col2
나는 추가할 것이다:
OUTPUT deleted.*, inserted.*
내가 일반적으로 하는 일은 롤백된 트랜잭션에 모든 것을 넣고 "OUTPUT"
사용하는 것입니다. 내가 보는 것에 만족하면 ROLLBACK
을 COMMIT
로 변경합니다.
나는 일반적으로 내가 한 일을 문서화해야 하므로 "results to Text"
옵션을 사용하고 스크립트와 OUTPUT의 결과를 모두 저장합니다. (물론 너무 많은 행을 변경하면 실용적이지 않습니다)
답변자 : Cornezuelo del Centeno
UPDATE table AS a INNER JOIN table2 AS b ON a.col1 = b.col1 INNER JOIN ... AS ... ON ... = ... SET ... WHERE ...
답변자 : Mateen
아래 솔루션은 MySQL 데이터베이스에서 작동합니다.
UPDATE table1 a , table2 b SET a.columname = 'some value' WHERE b.columnname IS NULL ;
답변자 : Govind Tupkar
select 문에서 업데이트하는 다른 방법:
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'
답변자 : Santhana
옵션 1: 내부 조인 사용:
UPDATE A SET A.col1 = B.col1, A.col2 = B.col2 FROM Some_Table AS A INNER JOIN Other_Table AS B ON A.id = B.id WHERE A.col3 = 'cool'
옵션 2: 공동 관련 하위 쿼리
UPDATE table SET Col1 = B.Col1, Col2 = B.Col2 FROM ( SELECT ID, Col1, Col2 FROM other_table) B WHERE B.ID = table.ID
답변자 : theking2
다른 사람들과 마찬가지로 MySQL 또는 MariaDB 는 다른 구문을 사용한다는 점을 지적하는 것이 중요합니다. 또한 T/SQL과 달리 매우 편리한 USING 구문을 지원합니다. 또한 INNER JOIN은 JOIN과 동의어입니다. 따라서 원래 질문의 쿼리는 MySQL에서 다음과 같이 가장 잘 구현됩니다.
UPDATE Some_Table AS Table_A JOIN Other_Table AS Table_B USING(id) SET Table_A.col1 = Table_B.col1, Table_A.col2 = Table_B.col2 WHERE Table_A.col3 = 'cool'
나는 다른 답변에서 질문에 대한 해결책을 보지 못했기 때문에 두 센트를 받았습니다. (PHP 7.4.0 MariaDB 10.4.10에서 테스트됨)
답변자 : Rokonz Zaz
UPDATE table1 SET column1 = (SELECT expression1 FROM table2 WHERE conditions) [WHERE conditions];
SQL Server에서 다른 테이블의 데이터로 한 테이블을 업데이트할 때 UPDATE 문의 구문
출처 : Here
출처 : http:www.stackoverflow.com/questions/2334712/how-do-i-update-from-a-select-in-sql-server">