programing

SQL Server에서 하위 쿼리를 사용하여 쿼리 업데이트

telecom 2023. 4. 10. 20:57
반응형

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

반응형