2012-10-27 2 views
2

두 개의 필드, StudentName 및 Grade가있는 테이블이 있습니다. 등급을 업데이트하는 저장 프로 시저를 작성하려고합니다. 학생이 A를 가졌 으면 B로 변경하고 싶습니다. B가 있으면 A로 변경하고 싶습니다. 다른 것이 있으면 혼자두고 싶습니다. 여기에 당신이 이런 식으로 떨어지게를 작성할 수 CASE테이블을 업데이트하는 저장 프로 시저의 if 문을 사용하는 SQL

UPDATE Students 
SET Grade = 
(
    CASE WHEN Grade = 'A' THEN 'B' 
     WHEN Grade = 'B' THEN 'A' 
     ELSE Grade  -- "If they have anything else I want to leave it alone." 
    END 
) 

또는

UPDATE Students 
SET Grade = 
(
    CASE WHEN Grade = 'A' 
     THEN 'B' 
     ELSE 'A' 
    END 
) 
WHERE Grade IN ('A','B') 

답변

5

입니다. 이 솔루션에서는 join 부분에 업데이트 규칙을 정의한 다음 업데이트합니다.

create procedure sp_changegrades 
as 
begin 
    update Students set 
     Grade = G.Grade_New 
    from Students as S 
     inner join (values 
      ('A', 'B'), 
      ('B', 'A') 
     ) as G(Grade_Old, Grade_New) on G.Grade_Old = S.Grade 
end 

또는 당신은 당신은 Case 문을 사용하고, 당신은 단지 relavant 행을 업데이트 할 수 있도록 where 절을 추가 할 수 있습니다 case

create procedure sp_changegrades 
as 
begin 
    update Students set 
     Grade = 
      case Grade 
       when 'A' then 'B' 
       when 'B' then 'A' 
       else Grade 
      end 
end 
+1

당신은 아마 학년 ('A', 'B') –

0

를 사용 최선을 시도

create procedure sp_changegrades 
if Grade = 'A' update Students set Grade = 'B' 

else if Grade = 'B' update Students set Grade = 'A' 
+1

에서 첫 번째 질의는'갱신의 설정을 읽어야 ... 학생에서 가입 내부에요으로 where 절을 추가하여 여기에 효율성을 추가 할 수 있습니다. ..' 또는'학생들이 ... 내부 학생이 ... '두 번째 질의는 John Woo의 대답의 복사본처럼 보입니다. – Andomar

+0

@Andomar 당신은'update s'에 대해 틀린데, 질의가 정확합니다. 두 번째 것은 John과 거의 동일 해 보입니다. 명백한 해법입니다. :) 더 많은 자유를 줄 수 있기 때문에'join '솔루션이 더 좋아요. 예를 들어 두 개의 필드를 동일한 규칙에 따라 업데이트 할 수 있습니다. –

+0

첫 번째 쿼리는'from' 절에 Student에 대한 참조가 하나뿐이기 때문에 "작동"합니다. 이 경우 SQL Server에서는 테이블 이름과 별칭을 모두 사용할 수 있습니다. 이 특별한 트릭을 사용하면 코드를 읽기가 어려워집니다. – Andomar

0

를 사용할 수 있습니다.

UPDATE Students 
SET Grade = 
(
    CASE WHEN Grade = 'A' THEN 'B' 
     WHEN Grade = 'B' THEN 'A' 
     ELSE Grade  -- "Included for Completeness, should never be utilized." 
    END 
) 
WHERE Grade in ('A','B')