[SQL] 어떻게 업데이트는 SQL Server에서 SELECT에서합니까?
SQL어떻게 업데이트는 SQL Server에서 SELECT에서합니까?
SQL 서버에서는 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
해결법
-
==============================
1.
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'
-
==============================
2.(더 이상)에서 SQL 서버 2008을 사용 MERGE
(더 이상)에서 SQL 서버 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;
-
==============================
3.
UPDATE YourTable SET Col1 = OtherTable.Col1, Col2 = OtherTable.Col2 FROM ( SELECT ID, Col1, Col2 FROM other_table) AS OtherTable WHERE OtherTable.ID = YourTable.ID
-
==============================
4.나는 다음에 로빈의 훌륭한 대답을 수정할 것입니다 :
나는 다음에 로빈의 훌륭한 대답을 수정할 것입니다 :
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 절을하지 않고, 당신도 영향을받을 필요가 없습니다 행, 정말 해고하지 말았어야 수 (아마도) 원인 인덱스 재 계산 화재 트리거에 영향을 미칠 수 있습니다.
-
==============================
5.일방 통행
일방 통행
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'
-
==============================
6.아직 언급되지 않은 또 다른 가능성은 단지 CTE에 SELECT 문 자체를 척하고 CTE를 업데이트하는 것입니다.
아직 언급되지 않은 또 다른 가능성은 단지 CTE에 SELECT 문 자체를 척하고 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 문을 실행하기 쉽다는 장점을 가지고 있지만 않습니다 그들이 소스 및 목표 테이블에서 같은 이름 경우 위와 같이 별칭에 열을 당신이 필요합니다.
이것은 또한 다른 답변 네에 도시 된 구문 FROM 독점 UPDATE와 같은 제한 ... 갖는다. 소스 테이블이 일대의 여러 측면에있는 경우는 (업데이트에 사용되는 가능한 매칭되는 합류 기록 결정적 (undeterministic)이며 다음 조인되는 문제에 대한 시도가있는 경우 오류를 제기하여 MERGE를 피합니다 ) 두 번 이상 같은 행을 업데이트합니다.
-
==============================
7.기록 (그리고했다 I와 같은 검색 등)의 경우는 다음과 같이 MySQL의에서 그것을 할 수 있습니다 :
기록 (그리고했다 I와 같은 검색 등)의 경우는 다음과 같이 MySQL의에서 그것을 할 수 있습니다 :
UPDATE first_table, second_table SET first_table.color = second_table.color WHERE first_table.id = second_table.foreign_id
-
==============================
8.별칭을 사용 :
별칭을 사용 :
UPDATE t SET t.col1 = o.col1 FROM table1 AS t INNER JOIN table2 AS o ON t.id = o.id
-
==============================
9.그것을 할 수있는 간단한 방법은 다음과 같습니다
그것을 할 수있는 간단한 방법은 다음과 같습니다
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
-
==============================
10.이것은 (예를 들어, 주로 절차에 사용) 업데이트를 수행 할 수있는 틈새 이유가 될 수도 있고, 다른 사람에게 명백한 수 있지만, 그것은 또한 당신이 사용하지 않고 갱신-SELECT 문을 수행 케이스에 (에 가입 할 수 있음을 명시해야 테이블에는 공통 필드가없는 사이에있는 거 업데이트).
이것은 (예를 들어, 주로 절차에 사용) 업데이트를 수행 할 수있는 틈새 이유가 될 수도 있고, 다른 사람에게 명백한 수 있지만, 그것은 또한 당신이 사용하지 않고 갱신-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
-
==============================
11.여기에 또 다른 유용한 구문은 다음과 같습니다
여기에 또 다른 유용한 구문은 다음과 같습니다
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);
null의 여부 "WHERE 존재"사용하여 경우는 확인합니다.
-
==============================
12.대신 SQL 서버의 MySQL을 사용하는 경우, 구문은 다음과 같습니다
대신 SQL 서버의 MySQL을 사용하는 경우, 구문은 다음과 같습니다
UPDATE Table1 INNER JOIN Table2 ON Table1.id = Table2.id SET Table1.col1 = Table2.col1, Table1.col2 = Table2.col2
-
==============================
13.이 업데이트를 수행하기 전에 업데이트됩니다을 확인할 수 있도록 그것을 쓸 수있는 빠른 방법을 볼 수 있도록 나는 단지이를 추가합니다.
이 업데이트를 수행하기 전에 업데이트됩니다을 확인할 수 있도록 그것을 쓸 수있는 빠른 방법을 볼 수 있도록 나는 단지이를 추가합니다.
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
-
==============================
14.SELECT에서 INNER와 UPDATE는 SQL 데이터베이스에 가입하세요
SELECT에서 INNER와 UPDATE는 SQL 데이터베이스에 가입하세요
가장 많이있는이 게시물의 너무 많은 답장,이 때문에 내가 너무 여기에 내 제안을 제공 할 것이라고 생각까지 - 투표했다. 질문은 매우 흥미로운이지만, 나는 많은 포럼 사이트에서 볼 수 및 INNER 스크린 샷으로 가입하여 솔루션을 만들었습니다.
처음에는 테이블 schoolold로 이름과 열 이름에 대한 몇 가지 기록을 삽입하고 실행을 만들었습니다.
그럼 내가 삽입 된 레코드를 볼 SELECT 명령을 실행.
그럼 난 schoolnew 유사 그것은에 대한 작업 위의 실행과 함께라는 새 테이블을 만들었습니다.
그런 다음, 거기에보기 삽입 된 기록에, 나는 SELECT 명령을 실행합니다.
자, 여기가 내가 가입 INNER와 UPDATE 명령을 실행,이 작업을 완료하는 데, 세 번째와 네 번째 행의 일부 내용을 변경하고자합니다.
변경 내용을 보려면 나는 SELECT 명령을 실행합니다.
당신은 테이블 schoolold의 세 번째와 네 번째 기록을 쉽게 INNER이 UPDATE 문으로 가입 사용하여 테이블 schoolnew로 대체하는 방법을 볼 수 있습니다.
-
==============================
15.그리고 당신은 (너무 자주 발생하지 것이다) 자체와 테이블에 가입하기를 원한다면 :
그리고 당신은 (너무 자주 발생하지 것이다) 자체와 테이블에 가입하기를 원한다면 :
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
-
==============================
16.다음 예는 추가 업데이트에 대한 이전 및 새 값을 반환하는 파생 테이블, FROM 절 후 SELECT 문을 사용합니다 :
다음 예는 추가 업데이트에 대한 이전 및 새 값을 반환하는 파생 테이블, 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
-
==============================
17.CTE를 통해 업데이트는 여기에 다른 답변보다 더 많은 읽을 수 있습니다 :
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
-
==============================
18.SQL Server를 사용하는 경우는 조인을 지정하지 않고 서로 하나 개의 테이블을 업데이트하고 단순히 where 절에서이 둘을 연결할 수 있습니다. 이것은 매우 간단한 SQL 쿼리를 만드는 :
SQL Server를 사용하는 경우는 조인을 지정하지 않고 서로 하나 개의 테이블을 업데이트하고 단순히 where 절에서이 둘을 연결할 수 있습니다. 이것은 매우 간단한 SQL 쿼리를 만드는 :
UPDATE Table1 SET Table1.col1 = Table2.col1, Table1.col2 = Table2.col2 FROM Table2 WHERE Table1.id = Table2.id
-
==============================
19.모든 통합 다른 여기에 접근한다.
모든 통합 다른 여기에 접근한다.
샘플 테이블 구조는 다음과 Product_BAK에서 제품 테이블에 업데이트됩니다.
CREATE TABLE [dbo].[Product]( [Id] [int] IDENTITY(1, 1) NOT NULL, [Name] [nvarchar](100) NOT NULL, [Description] [nvarchar](100) NULL ) ON [PRIMARY]
CREATE TABLE [dbo].[Product_BAK]( [Id] [int] IDENTITY(1, 1) NOT NULL, [Name] [nvarchar](100) NOT NULL, [Description] [nvarchar](100) NULL ) ON [PRIMARY]
update P1 set Name = P2.Name from Product P1 inner join Product_Bak P2 on p1.id = P2.id where p1.id = 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
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 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);
-
==============================
20.다른 방법은 파생 테이블을 사용하는 것입니다 :
다른 방법은 파생 테이블을 사용하는 것입니다 :
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
-
==============================
21.
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
-
==============================
22.이 경우에도 짧은 방법이며 그것은 당신을 위해 놀라운 일이 될 수 있습니다
이 경우에도 짧은 방법이며 그것은 당신을 위해 놀라운 일이 될 수 있습니다
샘플 데이터 세트 :
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];
-
==============================
23.사용하다:
사용하다:
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')
-
==============================
24.허용 대답에서, 후 :
허용 대답에서, 후 :
SET Table_A.col1 = Table_B.col1, Table_A.col2 = Table_B.col2
나는 추가합니다 :
OUTPUT deleted.*, inserted.*
내가 일어날 모든 것을보고 이런 식으로 : 내가 주로하는 일은 롤 백업 거래에서 최선을 다하는하고 "OUTPUT"를 사용하고 있습니다. 내가 무엇을보고 행복 해요 때, 나는 COMMIT로 롤백을 변경합니다.
나는 스크립트와 OUTPUT 결과 모두 저장 롤 백업 쿼리 및 I을 실행할 때 옵션 "텍스트로 결과"를 사용 그래서 나는 보통, 내가 무슨 짓을 문서화해야합니다. (물론 이것은 내가 너무 많은 행을 변경 한 경우 실용적이지 않습니다)
-
==============================
25.아래의 솔루션은 MySQL 데이터베이스 작동 :
아래의 솔루션은 MySQL 데이터베이스 작동 :
UPDATE table1 a , table2 b SET a.columname = 'some value' WHERE b.columnname IS NULL ;
-
==============================
26.select 문에서 업데이트 할 다른 방법 :
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'
-
==============================
27.
UPDATE table AS a INNER JOIN table2 AS b ON a.col1 = b.col1 INNER JOIN ... AS ... ON ... = ... SET ... WHERE ...
-
==============================
28.옵션 1 : 내부를 사용하여 가입 :
옵션 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
-
==============================
29.
UPDATE table1 SET column1 = (SELECT expression1 FROM table2 WHERE conditions) [WHERE conditions];
SQL 서버에서 다른 테이블에서 데이터를 하나 개의 테이블을 업데이트하는 UPDATE 문에 대한 구문
-
==============================
30.당신은 SQL 서버 업데이트를 위해이에서 사용할 수 있습니다
당신은 SQL 서버 업데이트를 위해이에서 사용할 수 있습니다
UPDATE T1 SET T1.col1 = T2.col1, T1.col2 = T2.col2 FROM Table1 AS T1 INNER JOIN Table2 AS T2 ON T1.id = T2.id WHERE T1.col3 = 'cool'
from https://stackoverflow.com/questions/2334712/how-do-i-update-from-a-select-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] T-SQL 분할 문자열 (0) | 2020.03.05 |
---|---|
[SQL] SQL Server의 누적 합계를 계산 (0) | 2020.03.05 |
[SQL] SQL 주입을 방지하는 좋은 방법은 무엇입니까? [복제] (0) | 2020.03.05 |
[SQL] 어떻게 SQL의 다른 열을 기준으로 DISTINCT MAX (열 값)와 행을 선택할 수 있습니까? (0) | 2020.03.05 |
[SQL] 나는 하나 개의 필드에 여러 개의 MySQL의 행을 연결할 수 있습니까? (0) | 2020.03.05 |