SQL Server에서 SELECT를 업데이트하려면 어떻게 해야 합니까?
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
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 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
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
스테이트먼트 자체에서 먼저 결과를 확인하지만 소스 테이블과 타깃 테이블에서 동일한 이름의 컬럼에 대해 위와 같은 에일리어스를 지정해야 합니다.
또한 인 ,, 것, 자, 자, 자 the the the the the the the the the the the the the the the the the the the the the the the the the the the the the the the 와 같은 제한이 .UPDATE ... FROM
4번으로 하겠습니다.이 1 대 는, 어느 쪽의 하고 있는 가, 「」에서합니다.Update
은)MERGE
는 같은 행을 여러 번 갱신하려고 하면 에러가 발생하지 않도록 합니다).
레코드는 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
간단한 방법은 다음과 같습니다.
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
이는 업데이트(예를 들어 절차에서 주로 사용됨)를 수행하는 데 적합한 이유일 수도 있고 다른 사람들에게는 명백한 이유일 수도 있지만, 업데이트 중인 테이블에 공통 필드가 없는 경우 join을 사용하지 않고 업데이트 선택 문을 실행할 수 있다는 점도 명시해야 합니다.
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
다른 편리한 구문을 다음에 나타냅니다.
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」를 사용하고, 늘인지 아닌지를 확인합니다.
업데이트를 수행하기 전에 업데이트 내용을 확인할 수 있도록 빠른 작성 방법을 보기 위해 이 항목을 추가합니다.
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
SQL Server 대신 MySQL을 사용하는 경우 구문은 다음과 같습니다.
UPDATE Table1
INNER JOIN Table2
ON Table1.id = Table2.id
SET Table1.col1 = Table2.col1,
Table1.col2 = Table2.col2
SQL 데이터베이스의 내부 결합을 사용하여 SELECT에서 업데이트
가장 높은 투표율을 보이고 있는 이 투고에는 답장이 너무 많기 때문에, 여기서도 제 제안을 드리려고 합니다.질문은 매우 흥미롭지만, 저는 많은 포럼 사이트에서 보고 스크린샷과 함께 INSER JOIN을 사용하여 해결책을 만들었습니다.
처음에 schoolold라는 이름의 테이블을 만들고 컬럼 이름에 대한 레코드를 몇 개 삽입하여 실행하였습니다.
그런 다음 SELECT 명령을 실행하여 삽입된 레코드를 봅니다.
그런 다음 schoolnew라는 이름의 새로운 테이블을 만들었습니다.이 테이블에는 위의 액션이 비슷하게 실행되었습니다.
삽입된 레코드를 보려면 SELECT 명령을 실행합니다.
여기서 세 번째 줄과 네 번째 줄에서 몇 가지 변경을 하고 이 액션을 완료하기 위해 INSER JOIN을 사용하여 UPDATE 명령을 실행합니다.
변경을 표시하려면 SELECT 명령을 실행합니다.
UPDATE 문과 함께 INSER JOIN을 사용하면 테이블 스쿨올드의 3번째 및 4번째 레코드가 테이블 스쿨뉴로 쉽게 대체되는 방법을 확인할 수 있습니다.
또한 테이블 자체에 참여하고 싶은 경우(흔히 있는 일은 아닙니다)
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
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
다음 예제에서는 파생된 테이블(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
하지 않고 됩니다.또한 이 두 테이블을 링크할 수 있습니다.where
절을 클릭합니다.SQL을 사용합니다.
UPDATE Table1
SET Table1.col1 = Table2.col1,
Table1.col2 = Table2.col2
FROM
Table2
WHERE
Table1.id = Table2.id
여기에 모든 다른 접근 방식을 통합합니다.
- 업데이트 선택
- 공통 테이블식으로 업데이트
- 머지
샘플 테이블 구조는 다음과 같습니다.Product_B에서 갱신됩니다.AK에서 제품 테이블로.
테이블 제품
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);
다른 방법은 파생 테이블을 사용하는 것입니다.
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
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
더 짧은 방법도 있습니다.놀라실 수도 있습니다.
샘플 데이터 세트:
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];
용도:
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')
수락된 답변에서 다음 항목 뒤에 있습니다.
SET
Table_A.col1 = Table_B.col1,
Table_A.col2 = Table_B.col2
다음과 같이 덧붙입니다.
OUTPUT deleted.*, inserted.*
가 주로 롤백 을 사용하는 입니다."OUTPUT"
이런 식으로 앞으로 일어날 모든 일을 봅니다.내가 보는 것에 만족할 때, 나는 그것을 바꾼다.ROLLBACK
안으로COMMIT
.
저는 보통 제가 한 일을 기록해야 하기 때문에"results to Text"
롤백 쿼리를 실행하고 스크립트와 OUTPUT 결과를 모두 저장하는 옵션입니다(물론 행을 너무 많이 변경하면 이 방법은 실용적이지 않습니다).
UPDATE table AS a
INNER JOIN table2 AS b
ON a.col1 = b.col1
INNER JOIN ... AS ...
ON ... = ...
SET ...
WHERE ...
MySQL 데이터베이스에서는 다음 솔루션이 작동합니다.
UPDATE table1 a , table2 b
SET a.columname = 'some value'
WHERE b.columnname IS NULL ;
다른 방법으로 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'
옵션 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
UPDATE table1
SET column1 = (SELECT expression1
FROM table2
WHERE conditions)
[WHERE conditions];
SQL Server의 다른 테이블의 데이터로 테이블을 업데이트할 때 UPDATE 문에 대한 구문입니다.
MySQL 또는 MariaDB는 다른 구문을 사용한다는 점을 지적하는 것이 중요합니다.또한 매우 편리한 USING 구문을 지원합니다(T/SQL과는 대조적으로).이너조인은 조인(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에서 테스트 완료)
언급URL : https://stackoverflow.com/questions/2334712/how-do-i-update-from-a-select-in-sql-server
'programing' 카테고리의 다른 글
시간을 고려하지 않고 날짜 시간 열별로 그룹화하는 방법 (0) | 2023.04.07 |
---|---|
포스트그레가 뭐죠?ISNULL()에 상당하는 SQL (0) | 2023.04.07 |
하위 쿼리에서 여러 행을 단일 구분 필드로 "연결"하는 SQL Server 함수를 만드는 방법은 무엇입니까? (0) | 2023.04.07 |
ID 일치를 기반으로 한 테이블에서 다른 테이블로의 SQL 업데이트 (0) | 2023.04.07 |
표 변수에 색인 작성 (0) | 2023.04.07 |