Programing

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

crosscheck 2020. 11. 23. 07:47
반응형

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

그런 다음 두 개의 테이블 별칭 ab. 이러한 별칭을 사용하면 테이블 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

반응형