복붙노트

[SQL] 는 SQL 서버에서 하위 쿼리를 사용하여 업데이트 쿼리

SQL

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

나는이 같은 간단한 테이블 구조를 가지고 :

테이블 tempData

╔══════════╦═══════╗
║   NAME   ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║    80 ║
║ Ravi     ║    85 ║
║ Sanjay   ║    90 ║
╚══════════╩═══════╝

그리고이 같은 tempDataView 같은 다른 테이블 이름이

╔══════════╦═══════╗
║   NAME   ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║       ║
║ Narendra ║       ║
║ Narendra ║       ║
║ Narendra ║       ║
║ Ravi     ║       ║
║ Ravi     ║       ║
║ Sanjay   ║       ║
╚══════════╩═══════╝

나는 tempData보기에 따라 마크를 설정하여, 테이블 tempData보기를 업데이트 할 - 이름 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

사실 그것은 나를 하위 쿼리를 사용하여 해결하기위한 숙제 같아요.

해결법

  1. ==============================

    1.당신은 심지어 UPDATE 문에 두 테이블에 가입 할 수 있습니다

    당신은 심지어 UPDATE 문에 두 테이블에 가입 할 수 있습니다

    UPDATE  a
    SET     a.marks = b.marks
    FROM    tempDataView a
            INNER JOIN tempData b
                ON a.Name = b.Name
    

    빠른 성능을 위해 두 테이블에 열 표시에 INDEX를 정의합니다.

    하위 쿼리를 사용하여

    UPDATE  tempDataView 
    SET     marks = 
            (
              SELECT marks 
              FROM tempData b 
              WHERE tempDataView.Name = b.Name
            )
    
  2. ==============================

    2.당신은 그냥 배우는 때문에 나는 당신이 SELECT는 UPDATE에 조인 또는 DELETE 조인 변환 연습을 제안한다. 우선은이 두 테이블을 조인 SELECT 문을 생성 제안 :

    당신은 그냥 배우는 때문에 나는 당신이 SELECT는 UPDATE에 조인 또는 DELETE 조인 변환 연습을 제안한다. 우선은이 두 테이블을 조인 SELECT 문을 생성 제안 :

    SELECT *
    FROM    tempDataView a
            INNER JOIN tempData b
                ON a.Name = b.Name
    

    그런 다음 우리는 두 개의 테이블 별칭 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 문을 사용하여 문을 변환합니다. 문은 아래 만 기록을 위해 (그대로 b를 떠나)에서 삭제됩니다 해당 이름의 일치 :

    DELETE a
    FROM    tempDataView a
            INNER JOIN tempData b
                ON a.Name = b.Name
    

    당신은 놀이터로 JW에 의해 생성 된 SQL 바이올린을 사용할 수 있습니다

  3. ==============================

    3.이 스레드의 제목은 하위 쿼리가 업데이트에 사용할 수있는 방법을 묻습니다. 다음은 그 예입니다 :

    이 스레드의 제목은 하위 쿼리가 업데이트에 사용할 수있는 방법을 묻습니다. 다음은 그 예입니다 :

    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
    
  4. ==============================

    4.몇 가지 예를 들면 다음과 업데이트 작업의 좋은 설명입니다. 이 포스트 그레스 사이트이지만, 비록 SQL 쿼리도 다른 DB에 유효합니다. 다음 예는 이해하기 직관적이다.

    몇 가지 예를 들면 다음과 업데이트 작업의 좋은 설명입니다. 이 포스트 그레스 사이트이지만, 비록 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);
    
  5. ==============================

    5.내가 업데이트 및 subquerys과 같은 문제가 있었기 때문에 여기 내 예제에서 나는, 이것의 해결책을 찾을 수 있습니다 :

    내가 업데이트 및 subquerys과 같은 문제가 있었기 때문에 여기 내 예제에서 나는, 이것의 해결책을 찾을 수 있습니다 :

    UPDATE
        A
    SET
        A.ValueToChange = B.NewValue
    FROM
        (
            Select * From C
        ) B
    Where 
        A.Id = B.Id
    
  6. from https://stackoverflow.com/questions/14618703/update-query-using-subquery-in-sql-server by cc-by-sa and MIT license