SQL Server에서 하위 쿼리를 사용하여 쿼리 업데이트
다음과 같은 간단한 테이블 구조가 있습니다.
테이블 tempData
╔══════════╦═══════╗
║ NAME ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║ 80 ║
║ Ravi ║ 85 ║
║ Sanjay ║ 90 ║
╚══════════╩═══════╝
그리고 이와 같은 tempDataView 와 같은 다른 테이블 이름도 있습니다.
╔══════════╦═══════╗
║ NAME ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║ ║
║ Narendra ║ ║
║ Narendra ║ ║
║ Narendra ║ ║
║ Ravi ║ ║
║ Ravi ║ ║
║ Sanjay ║ ║
╚══════════╩═══════╝
나는 테이블 업데이트 할 tempDataView를 설정에 따라, 마크 받는 사람에 따라 tempDataView을 - 이름 에 비해 tempData - 이름
예, 내가 시도한 것을 보여 드리겠습니다. 커서를 사용 하여이 문제를 해결하려고 시도했으며 완벽하게 해결되었지만 하위 쿼리를 사용하여 해결하는 방법을 찾고 있습니다.
여기있어:
Declare @name varchar(50),@marks varchar(50)
Declare @cursorInsert CURSOR
set @cursorInsert = CURSOR FOR
Select name,marks from tempData
OPEN @cursorInsert
FETCH NEXT FROM @cursorInsert
into @name,@marks
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE tempDataView set marks = @marks where name = @name
FETCH NEXT FROM @cursorInsert
INTO @name,@marks
END
CLOSE @cursorInsert
DEALLOCATE @cursorInsert
실제로 Subquery를 사용하여 해결하는 것은 숙제와 같습니다.
UPDATE
명령문 에서도 두 테이블을 결합 할 수 있습니다 .
UPDATE a
SET a.marks = b.marks
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
더 빠른 성능을 위해 두 테이블 모두 INDEX
에 on 열 marks
을 정의하십시오 .
사용 SUBQUERY
UPDATE tempDataView
SET marks =
(
SELECT marks
FROM tempData b
WHERE tempDataView.Name = b.Name
)
배우기 때문에 SELECT 조인을 UPDATE 또는 DELETE 조인으로 변환하는 연습을하는 것이 좋습니다. 먼저 다음 두 테이블을 결합하는 SELECT 문을 생성하는 것이 좋습니다.
SELECT *
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
그런 다음 두 개의 테이블 별칭 a
및 b
. 이러한 별칭을 사용하면 테이블 a 또는 b를 업데이트하는 UPDATE 문을 쉽게 생성 할 수 있습니다. 테이블 a의 경우 JW에서 제공 한 답변이 있습니다. 을 업데이트하려는 경우 b
문은 다음과 같습니다.
UPDATE b
SET b.marks = a.marks
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
이제 문을 DELETE 문으로 변환하려면 동일한 접근 방식을 사용하십시오. 아래 문 a
은 이름으로 일치하는 레코드에 대해서만 (b 그대로 유지) 삭제합니다 .
DELETE a
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
JW에서 만든 SQL Fiddle을 플레이 그라운드로 사용할 수 있습니다.
The title of this thread asks how a subquery can be used in an update. Here's an example of that:
update [dbName].[dbo].[MyTable]
set MyColumn = 1
where
(
select count(*)
from [dbName].[dbo].[MyTable] mt2
where
mt2.ID > [dbName].[dbo].[MyTable].ID
and mt2.Category = [dbName].[dbo].[MyTable].Category
) > 0
Here is a nice explanation of update operation with some examples. Although it is Postgres site, but the SQL queries are valid for the other DBs, too. The following examples are intuitive to understand.
-- Update contact names in an accounts table to match the currently assigned salesmen:
UPDATE accounts SET (contact_first_name, contact_last_name) =
(SELECT first_name, last_name FROM salesmen
WHERE salesmen.id = accounts.sales_id);
-- A similar result could be accomplished with a join:
UPDATE accounts SET contact_first_name = first_name,
contact_last_name = last_name
FROM salesmen WHERE salesmen.id = accounts.sales_id;
However, the second query may give unexpected results if salesmen.id is not a unique key, whereas the first query is guaranteed to raise an error if there are multiple id matches. Also, if there is no match for a particular accounts.sales_id entry, the first query will set the corresponding name fields to NULL, whereas the second query will not update that row at all.
Hence for the given example, the most reliable query is like the following.
UPDATE tempDataView SET (marks) =
(SELECT marks FROM tempData
WHERE tempDataView.Name = tempData.Name);
참고URL : https://stackoverflow.com/questions/14618703/update-query-using-subquery-in-sql-server
'Programing' 카테고리의 다른 글
출력을 bash 함수로 파이프 (0) | 2020.11.23 |
---|---|
RadioButton-사용자 정의 드로어 블을 사용하는 방법? (0) | 2020.11.23 |
Xvfb 실패 시작 오류 (0) | 2020.11.23 |
Android 에스프레소에서 토스트 메시지 확인 (0) | 2020.11.23 |
jQuery를 사용하여 div가 스크롤을 부드럽게 따르도록 만드는 방법은 무엇입니까? (0) | 2020.11.23 |