query - sqlserver where
SQL Server의 SELECT에서 어떻게 업데이트합니까? (20)
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
- 내부 결합 사용
UPDATE A SET A.col1 = B.col1, A.col2 = B.col2 FROM Some_Table from 내부 조인 Other_Table AS B ON A.id = B.id WHERE A.col3 = 'cool'
- Co 관련 하위 쿼리
UPDATE 테이블 SET Col1 = B.Col1, Col2 = B.Col2 FROM (SELECT ID, Col1, Col2 from other_table) B WHERE B.ID = table.ID
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;
SQL Server를 사용하는 경우 조인을 지정하지 않고 다른 테이블에서 하나의 테이블을 업데이트하고 where
절에서 두 테이블을 간단히 연결할 수 있습니다. 이것은 훨씬 간단한 SQL 쿼리를 만든다.
UPDATE Table1
SET Table1.col1 = Table2.col1,
Table1.col2 = Table2.col2
FROM
Table2
WHERE
Table1.id = Table2.id
SQL Server에서이 업데이트를 사용할 수 있습니다.
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'
간단한 방법은 다음과 같습니다.
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
그리고 당신이 테이블 자체에 가입하고 싶다면 (너무 자주 일어나지는 않을 것입니다) :
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
다른 방법은 파생 테이블을 사용하는 것입니다.
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
다음 예에서는 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
레코드 (그리고 내가 생각한 다른 것들)를 위해서, 당신은 다음과 같이 MySQL에서 그것을 할 수있다 :
UPDATE first_table, second_table
SET first_table.color = second_table.color
WHERE first_table.id = second_table.foreign_id
별칭 사용 :
UPDATE t
SET t.col1 = o.col1
FROM table1 AS t
INNER JOIN
table2 AS o
ON t.id = o.id
아래의 솔루션은 MySQL 데이터베이스에서 작동합니다 :
UPDATE table1 a , table2 b
SET a.columname = 'some value'
WHERE b.columnname IS NULL ;
아직 언급되지 않은 또 다른 가능성은 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
가 시도하는 경우 오류가 발생하여 피할 수있는 문제). 동일한 행을 두 번 이상 업데이트하십시오.)
용도:
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')
이 방법은 업데이트를하기 전에 업데이트 될 내용을 확인할 수 있도록 빠른 방법으로 작성할 수 있도록하기 위해 추가합니다.
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
일방 통행
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'
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
더 짧은 방법 조차 있고 당신을 위해 의외일 것입니다 :
샘플 데이터 세트 :
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];
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'
UPDATE table
SET Col1 = i.Col1,
Col2 = i.Col2
FROM (
SELECT ID, Col1, Col2
FROM other_table) i
WHERE
i.ID = table.ID
UPDATE table AS a
INNER JOIN table2 AS b
ON a.col1 = b.col1
INNER JOIN ... AS ...
ON ... = ...
SET ...
WHERE ...