2012-03-15 4 views
0

커서를 사용하여 테이블을 업데이트하려고합니다. 그러나 일부 레코드 만 업데이트되고 다른 레코드는 업데이트되지 않습니다. 업데이트 쿼리의 where 절에 인덱스가있는 열이 있습니다. 이 문제와 관련하여 왜 그리고 어떻게해야하는지 설명해 주시겠습니까?일부 레코드가 업데이트되는 이유는 다른 레코드가 Oracle 11g에없는 이유는 무엇입니까?

update table_name 
set table_column1='text' 
where table_column2=(select distinct table_column2 from table); 

색인은 table_column2에 있습니다.

+0

그 유형입니까? 'table'이'table_name'이어야합니까? –

+0

where 하위 쿼리에서 무엇을 달성하려고합니까? 왜 당신은 별개의 것을 사용하고 있습니까? 가능할 때마다 구별을 피해야합니다. – tsells

+0

@Ramesh K-'table'과'table_name'이 다른 테이블이라면,'table'은'table_name'에있는'table_column2'의 모든 값을 가지고 있습니까? 어느 테이블도'table_column2'에'NULL' 값을 가질 수 있습니까? –

답변

0

교육적으로 추측 해 봅시다. SELECT DISTINCT TABLE_COLUMN2 FROM TABLE을 단독으로 실행하면 단일 값만을 반환한다는 것을 알게되고 DISTINCT 쿼리에서 반환 된 값과 동일한 TABLE_COLUMN2를 가진 TABLE_NAME의 행이 업데이트 된 것으로 간주됩니다. 이것은 아마도 데이터베이스의 데이터와 기대가 다른 경우 일 것입니다. DISTINCT 쿼리가 하나 이상의 값을 반환하면 오라클이 오류를 던질 것이기 때문에 (위의 @ a1ex07의 주석에서 언급했듯이)이 경우 여야합니다. 당신은 UPDATE 문의 동작에 영향을주지해야한다

update table_name 
    set table_column1='text' 
    where table_column2 IN (select distinct table_column2 from table) 

로, TABLE_COLUMN2에 인덱스를 IN 조건을 사용하는 쿼리를 다시 작성 할 수 있습니다.

공유하고 즐기십시오.

관련 문제