SQL Server에서 하위 쿼리를 사용하여 쿼리 업데이트
다음과 같은 간단한 표 구조가 있습니다.
테이블 temp
╔══════════╦═══════╗
║ NAME ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║ 80 ║
║ Ravi ║ 85 ║
║ Sanjay ║ 90 ║
╚══════════╩═══════╝
또한 tempDataView라는 다른 테이블 이름도 있습니다.
╔══════════╦═══════╗
║ NAME ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║ ║
║ Narendra ║ ║
║ Narendra ║ ║
║ Narendra ║ ║
║ Ravi ║ ║
║ Ravi ║ ║
║ Sanjay ║ ║
╚══════════╩═══════╝
tempDataView에 따라 Marks를 설정하고 tempDataView테이블을 갱신합니다.- tempData와 비교한 이름 - Name
네, 제가 시도한 것을 보여드릴게요.커서를 사용하여 이 문제를 해결하려고 했지만 완벽하게 해결되었습니다.서브쿼리를 사용하여 해결하는 방법을 찾고 있습니다.
여기 있습니다.
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
사실 서브쿼리를 사용해서 풀어야 할 숙제 같아요.
두 테이블을 모두 연결할 수 있습니다.UPDATE
진술들,
UPDATE a
SET a.marks = b.marks
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
퍼포먼스를 고속화하기 위해INDEX
열에서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
다음으로 테이블 에일리어스가 2개 있는 것에 주의해 주세요.a
그리고.b
. 이러한 에일리어스를 사용하면 UPDATE 문을 쉽게 생성하여 테이블a 또는 b 중 하나를 갱신할 수 있습니다.표 a에 대해 JW에서 제공한 답변이 있습니다.갱신하는 경우b
문장은 다음과 같습니다.
UPDATE b
SET b.marks = a.marks
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
이제 문을 DELETE 문으로 변환하려면 동일한 방법을 사용합니다.다음 문장은 다음에서 삭제됩니다.a
이름에 일치하는 레코드에 대해서만 (보존되지 않음)
DELETE a
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
JW가 만든 SQL Feelen을 놀이터로 사용할 수 있습니다.
이 샘플에서는 업데이트 및 서브쿼리에서도 같은 문제가 발생했기 때문에 이 해결 방법을 찾을 수 있습니다.
UPDATE
A
SET
A.ValueToChange = B.NewValue
FROM
(
Select * From C
) B
Where
A.Id = B.Id
이 스레드의 제목은 업데이트에서 하위 쿼리를 사용하는 방법을 묻습니다.예를 들어 다음과 같습니다.
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
여기에서는 업데이트 조작에 대해 몇 가지 예를 들어 설명합니다.Postgres 사이트이지만 SQL 쿼리는 다른 DB에도 유효합니다.다음은 직관적으로 이해할 수 있는 예입니다.
-- 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;
단, salesmen.id이 고유 키가 아닌 경우 두 번째 쿼리에서 예기치 않은 결과가 발생할 수 있습니다.단, 여러 ID가 일치하는 경우 첫 번째 쿼리에서 오류가 발생할 수 있습니다.또한 특정 accounts.sales_id 엔트리에 일치하는 항목이 없는 경우 첫 번째 쿼리는 대응하는 이름 필드를 NULL로 설정하고 두 번째 쿼리는 해당 행을 전혀 업데이트하지 않습니다.
따라서 이 예에서 가장 신뢰할 수 있는 쿼리는 다음과 같습니다.
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' 카테고리의 다른 글
일반 Git 저장소를 기본 저장소로 변환하려면 어떻게 해야 합니까? (0) | 2023.04.10 |
---|---|
이미지 변경을 위한 열거형 데이터트리거 (0) | 2023.04.10 |
vs (0) | 2023.04.10 |
한 파일에서 다른 파일에 없는 행을 빠르게 찾을 수 있는 방법? (0) | 2023.04.10 |
로컬 스토리지와 쿠키 (0) | 2023.04.10 |