2016-12-08 7 views
1

간단한 사례 문을 사용하여 표의 필드를 업데이트하고 싶습니다. 그러나이 case 문을 선택한 행에 적용하고 싶습니다. 이 행이 무엇인지 판별하는 유일한 f}은 다른 테이블에 조인 한 다음 두 x 째 테이블의 필드를 기]으로 한 조건을 갖는 것입니다.SQL Server 업데이트 표 2의 조건이있는 표 1

예를 들어, 하나가이 같은 업데이트 문 내부에 가입 할 수 없습니다 것 같다 ... 나는 그것이 작동 것이라고 생각하는 방법 그러나

update table1 
set table1.field1 = case 
    when table1.field1 = 'foo' then 'bar' 
    else 'foobar' 
end 
join table2 on table1.obj_id=table2.id 
where table2.field1 = 'fizzbuzz' 
and table2.field2 in ('foo', 'bar', 'foobar') 

입니다. 적어도 MS SQL에는 없습니다.

나는 대답을 찾으려고 노력했지만 사람들이 조인을 포함하여 다른 테이블의 데이터로 테이블을 업데이트하려고하는데, 그에 따라 사람은 내 조인이있는 곳에서 "출처"문을 넣을 것이고 중첩 된 선택은 그 안에 조인이있는 성명서. 나는 이것이 나를위한 해결책이라고 확신하지 못한다. 다른 테이블에서 업데이트하고 싶지 않습니다. 다른 테이블을 기반으로 필터링하고 싶습니다.

내가 생각할 수있는 유일한 해결책은 먼저 obj_id의 목록을 검색 한 다음 두 번째 업데이트 문에서이 ID 만 선택하는 두 가지 쿼리 솔루션입니다. 이상적이지 않습니다.

+0

이이 절에서 필요한 않는 SQL Server의 UPDATE 문에 가입 사용할 수 있습니까? – McNets

+0

"그러나 이것은 update 문 안에 조인을 할 수없는 것처럼 보입니다. 적어도 MS SQL에서는 그렇지 않습니다." . 그렇지 않다. – AK47

답변

2

하실 수 있습니다. 구문은 from이 필요합니다

update t1 
    set field1 = (case when t1.field1 = 'foo' then 'bar' else 'foobar' end) 
    from table1 t1 join 
     table2 t2 
     on t1.obj_id = t2.id 
    where t2.field1 = 'fizzbuzz' and 
      t2.field2 in ('foo', 'bar', 'foobar'); 
+0

그럼 내가 원하는 것을 분명히 할 수 있을까요? 그것이 나에게 들리는 것은 원래 테이블을 업데이트하고 from 절의 두 번째 테이블을 가질 것이지만 원본 테이블은 필터링되지 않으므로 모든 행을 확실히 업데이트 할 것입니다. 필요. 그러나 나는 그 행동이 그것이 들리는 것과는 다른 것이라고 생각합니다. – Luke

+1

@ 루크. . . 't1'은 갱신하려는 테이블의 테이블 별명입니다. 'update'를 위해 테이블 ​​별칭을 일관되게 사용하고'from' 절에 완전하게 구성된 테이블 로직을 넣는 것이 좋습니다. 이렇게하면 업데이트가 수행 할 작업을 확인하기 위해'select'로 변환하는 것이 훨씬 쉬워집니다. –

2
update t1 
set field1 = case 
    when t1.field1 = 'foo' then 'bar' 
    else 'foobar' 
end 
from table1 t1 
join table2 t2 on t1.obj_id=t2.id 
where t2.field1 = 'fizzbuzz' 
and t2.field2 in ('foo', 'bar', 'foobar'); 
3

우리는

update t1 
    set t1.field1 = case 
     when t1.field1 = 'foo' then 'bar' 
     else 'foobar' 
    end 
    from table1 t1 
    inner join table2 on t1.obj_id=table2.id 
    where table2.field1 = 'fizzbuzz' 
    and table2.field2 in ('foo', 'bar')