2011-04-28 161 views
1

假設我有值的表A更新記錄:從另一個表

表A:

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

和表B:

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

現在我要更新第二表1的行與表B的值1通過用於VAL3通過檢查在表B的值,其中表A的VAL2等於表B的值1。

我曾試圖更新它使用子查詢像

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 

查詢被成功執行,但該記錄不會得到更新。 的表A由具有對於該組 即特定的記錄也可以是 <Data2,Data3> or <null,Data3>(數據3不能爲空)

任何形式的幫助將不勝感激。

TIA,

問候,

阿布舍克

+2

注意,DISTINCT是** **沒有的功能。編寫'DISTINCT(col)'與'DISTINCT col'完全相同。它僅適用於括號內的列名是合法的。 – 2011-04-28 14:10:15

+3

'其中A.Data1 = B.Data2和B.Data2是null' - 請檢查。此where子句不能返回true。 – 2011-04-28 14:18:14

+1

修復您的示例表格,以便我們能夠理解您所說的內容。你說「TABLEA的VAL2等於表B的值1」,但條件是'A.Data1 = B.Data2'(無列數據2值1)。明確而明確地提出問題,你將成爲解決方案的一半。 – angus 2011-04-28 14:18:44

回答

0

這裏有一個如何更新根據自身和其他表之間的連接表的一般概述:

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. 

有有幾種不同的方式可以完成,這只是我使用的基本模板。

+2

我可能會誤解這個,但是這個語法在oracle中不起作用。 (更新t1設置val = tb.val {from ....})。你可以做一個更新TS組(可樂,COLB)=(選擇COL1,COL2從...) – Harrison 2011-04-28 14:24:49

+0

大抵如此。爲什麼不發佈工作語法? – 2011-04-28 15:17:43

+1

的確如此。但是,我們不要回復這個問題:爲什麼發佈不工作的語法? – 2011-04-29 06:36:27

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子句(和加盟)正在使這樣的事情不工作