線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:8482
推到 Plurk!
推到 Facebook!

ORACLE UPDATE JOIN TABLE 的問題!

尚未結案
Sanyuan
一般會員


發表:24
回覆:32
積分:11
註冊:2002-06-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-11 11:55:46 IP:211.75.xxx.xxx 未訂閱
小弟在ORACLE 8.1.7 兩個TABLE JOIN 後要UPDATE 所以下了下面的SQL 卻出現錯誤 請教各位是否有解(join所選擇的欄位,各是兩個TABLE的P.KEY) ============================== SQL> update (select fa2.month fa2_month , 2 fa2.type fa2_type, 3 fa2.item fa2_item, 4 fa2.no fa2_no , 5 ttl2.month ttl2_month, 6 ttl2.type ttl2_type , 7 ttl2.item ttl2_item , 8 ttl2.no ttl2_no 9 from fa2 , ttl2 10 where fa2.no = ttl2.no 11 and fa2.month = '9301' 12 and fa2.type = '0' 13 and fa2.item = '02' 14 and fa2.no is not null ) 15 set ttl2_no = dtlfa2_no ; set ttl2_no = fa2_no * 第 15 行發生錯誤: ORA-01779: 無法修改對映非保留鍵表的資料欄 ===========================================
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-11 21:29:57 IP:218.32.xxx.xxx 未訂閱
Sanyuan 你好: 不太清楚你的意圖, 只知道該 SQL 一定不行, 第 15 行 set ttl2_no = dtlfa2_no , "dtlfa2_no" ? 另外我不確定 Oracle 可以 Update 一個 Select Cursor ... 是否應該是: Update ttl2 set no= (select no from fa2 where ....)
Sanyuan
一般會員


發表:24
回覆:32
積分:11
註冊:2002-06-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-12 02:10:17 IP:61.56.xxx.xxx 未訂閱
謝謝Mickey的回答 很抱歉不是寫的很清楚 容我重新闡述一下 T1,T2兩個TABLE,名稱不同,但欄位相同(所以才須alias) T1與T2是一對多,由b欄位可看出 目的是update T2 set T2.c=T1.c 我做了個範例如下 -------------------------------- create table T1(a int,b int,c int,primary key(a)); insert into T1 values(1,1,888); insert into T1 values(2,2,777); insert into T1 values(3,3,666); create table T2(a int,b int,c int,primary key(a)); insert into T2 values(1,1,1); insert into T2 values(2,1,1); insert into T2 values(3,1,1); insert into T2 values(4,2,1); insert into T2 values(5,2,1); -------------------------------- 執行下列的SQL可以得到我想要的結果 UPDATE (SELECT T1.a T1a,T1.b T1b,T1.c T1c,T2.a T2a,T2.b T2b,T2.c T2c         FROM T1,T2 WHERE T1.a=T2.b) SET T2c=T1c; 不過很不幸的,實際上,T1,T2的P.Key 各是a,b,c 所以當 create table T1(a int,b int,c int,primary key(a,b,c)); create table T2(a int,b int,c int,primary key(a,b,c)); 再執行UPDATE就會出現 ORA-01779: 無法修改對映非保留鍵表的資料欄    不知這樣的思考是否正確?    或Update T2 set T2.c= (select T1.c from T1 where ....) 也可以? 請指教
Sanyuan
一般會員


發表:24
回覆:32
積分:11
註冊:2002-06-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-12 02:32:17 IP:61.56.xxx.xxx 未訂閱
凌晨兩點半 還在Try Mickey 前輩所說的方式 終於了解意思了,所以只要寫這麼一小行就可以解決了 UPDATE T2 Set T2.c=(select T1.c from T1 where T1.b=T2.b); 原來如此,小弟SQL功力真是太糟糕了 要好好再複習一下 幸好有Mickey前輩的點化. 悟了悟了 感謝感謝< >< >
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-12 14:44:35 IP:218.163.xxx.xxx 未訂閱
@@~ 凌晨兩點半........暗攻教 + 拼命三郎.........    您太客氣了.
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2015-04-22 15:07:30 IP:61.222.xxx.xxx 未訂閱
不好意思, 藉由此版留下筆記
我也遇到此問題, 搜google試出用view, 底下語法可行
update (select *
from tableA a join tableB b on a.no=b.no
where at1='O') set awh='8888';
達到如底下語法的效果
update tableB set awh='8888'
from tableA a join tableB b on a.no=b.no
where at1='O'
系統時間:2024-04-26 11:25:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!