2011-04-28 2 views
1

가정하자 다른 테이블에서 레코드를 업데이트 :내가 값으로 테이블 A가

표 A :

Data1 Data2 Data3 
-------------------- 
    Val2 null val3 
    null ValB Val3 

와 표 B :

Data1 Data2  
--------------- 
Value1 Value2 

가 지금은 2를 업데이트 할 tableA의 Val2가 TableB의 Value1과 동일한 TableB의 값을 검사하여 Val3에 대한 TableB의 값 1을 갖는 Table1의 행.

나는 쿼리가 성공적으로 실행되지만 레코드가 업데이트 점점되지

update TableA 
set Data1= 
    (Select distinct(B.Data1) 
    from TableB B,TableA A 
    where A.Data1=B.Data2 and B.Data2 is null) 
where Data3=Val3 

같은 하위 쿼리를 사용하여 업데이트 할 시도했다. TABLEA는 <Data2,Data3> or <null,Data3> 도움 어떤 종류는 이해할 것이다

(DATA3가 널이 될 수 없다) 될 수있는 세트 즉 특정 레코드를 구비한다. 이

UPDATE TableA 
set 
    TableAColumn = tb.TableBColumn 
    ,TableAOtherColumn = tb.TableBOtherColumn 
    ,etc. 
from TableA ta 
    inner join TableB tb 
    on tb.JoinColumn = ta.JoinColumn 
where ta.FurtherCriteriaColumn = @DesiredTargetValue 
    and/or tb.OtherCrieterioColumn <=> @SomeOtherValue 
    etc. 

:

TIA,

감사합니다,

Abhishek은

+2

DISTINCT는 ** 기능이 아닙니다 **. 'DISTINCT (col) '쓰기는'DISTINCT col '과 동일합니다. 괄호 안에 열 이름을 넣는 것이 합법적이기 때문에 작동합니다. –

+3

'A.Data1 = B.Data2이고 B.Data2가 null입니다. '-이 부분을 확인하십시오. 이 where 절은 true를 반환 할 수 없습니다. –

+1

당신이 말하는 것을 이해할 수 있도록 예제 테이블을 수정하십시오. 당신은 "TableA의 Val2는 TableB의 Value1과 동일하지만 조건은 A.Data1 = B.Data2 (Data2 열에는 값 1이 없음)라고 말합니다. 명확하고 명확한 질문을하면 솔루션의 절반이됩니다. – angus

답변

0

여기에 따라 테이블 자체 및 다른 테이블 사이의 조인을 업데이트하는 방법은 매우 일반적인 개요입니다 이 작업을 수행 할 수있는 몇 가지 방법이 있습니다.이 템플릿은 제가 사용하는 기본 템플릿 일뿐입니다.

+2

이 부분을 잘못 읽었을 수 있지만이 구문은 Oracle에서 작동하지 않습니다. (업데이트 t1 set val = tb.val {.... ....}). 업데이트를 할 수 있습니다. set (colA, colB) = (select col1, col2 from ...) – Harrison

+0

아마도 사실입니다. 왜 작동 구문을 게시하지 않습니까? –

+1

실제로 사실입니다. 그러나 주제를 되 돌리지 마십시오. 왜 작동하지 않는 구문을 게시합니까? –

1

쿼리가 작동하지만 원하는대로 일치하지 않습니다. 귀하의 질문을 바탕으로

은 (하지 귀하의 요구 사항에 작동하지 않는 샘플 데이터) 나는 희망

create table tablea(data1 varchar2(8) , data2 varchar2(8), data3 varchar2(8)); 
create table tableb(data1 varchar2(8) , data2 varchar2(8)); 

insert into tablea values('Val2',null,'Val3'); 
insert into tablea values(null,'ValB','Val3'); 

insert into tableB values('Value1','ValB'); 
insert into tableB values('NewValue','Val2'); 

update TableA 
    set Data1 = nvl((Select B.Data1 
       from TableB B --no need for join, I believe you want to join to the 'updating table' 
       where /*TableA.Data1=B.Data2 
        and B.Data2 is null*/ -- this won't work, null DOES NOT EQUAL NULL 
        TableA.Data1=B.Data2 
       ) ,TableA.Data1) --this way, if no data is returned from tableB.data1 to tableA join we will retain tableA.Data1 value 
where Data3='Val3' ; 


select * from tableA; 


DATA1 DATA2 DATA3  
-------- -------- -------- 
NewValue   Val3  
     ValB  Val3 

초기 질문에서 찾아보세요 올바른 방향을 가리 키도록 함께이를 넣어 귀하의 질문에 관해서는 귀하의 WHERE 조항 (및 합류)이 작동하지 않으므로 일이 작동하지 않습니다.

관련 문제