在oracle中用A表數據updateB表數據的問題,請大家賜教,急!!!!!!!!!!!!!

postfxj 2008-06-02 03:08:16
我的語句如下:
update kc set kc_cw=(select kc_cw1 from kc1 where kc_plbh=kc_plbh1 and kc_zh=kc_zh1 and kc_cw<>kc_cw1)
如果加上"and kc_cw1<>kc_cw1就會報不能把null值給kc_cw,去掉這一句不會有錯,但我想kc_cw不同的才更新呀,如何做呢。

如果是sqlserver如句應如下:經驗告訴我,下面語句在sqlserver執行就沒有問題。
update kc set kc_cw=kc_cw1
from kc1
where kc_plbh=kc_plbh1
and kc_zh=kc_zh1
and kc_cw<>kc_cw1
有什麼辦法讓我隻更新kc_cw不同的行,如果去掉它數據量太大了不知要更新多久。
...全文
169 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
postfxj 2008-06-03
  • 打赏
  • 举报
回复
搞定了,謝謝alarmiss,用以下方法搞定了。再次謝謝。

update kc a
set a.kc_cw=(select b.kc_cw1
from kc1 b
where a.kc_plbh = b.kc_plbh1
and a.kc_zh = b.kc_zh1 )
where exists(select * from kc1 c where a.kc_plbh = c.kc_plbh1 and a.kc_zh = c.kc_zh1 and a.kc_cw <> c.kc_cw1)

postfxj 2008-06-02
  • 打赏
  • 举报
回复
用這樣的語句改得好慢呀。
postfxj 2008-06-02
  • 打赏
  • 举报
回复
我現在是kc表中的數據出錯了,我要用kc1來恢復它。所以沒辦法用觸發器實現。
alarmiss 2008-06-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 postfxj 的回复:]
都是非空的,兩個表的結構是一模一樣的,隻是kc_cw這裡的值不一樣了,我以kc1的為準。
[/Quote]
很不好意思,我一直没有去数据库里面验证一下,没有理解问题的所在。
你的原sql的错误是由于在找不到匹配的值时会返回null导致的,
而set语句中的子查询的结果又无法在where中重复使用,所以1楼的方法很正确了,
where语句剔除了相同的记录,返回null的行不会被更新。

一直觉得这样做比较没效率,两个子查询不能共用,可是没办法在一条sql中解决
所以你可以试着使用视图来更新,或者在kc_cw1上建立触发器,自动更新.
postfxj 2008-06-02
  • 打赏
  • 举报
回复
merge into kc
using kc1
on (kc.plbh=kc1.plbh1 and kc.kc_zh=kc1.kc_zh1 and kc.kc_cw <>kc1.kc_cw1)
when matched then
update set kc.kc_cw=kc1.kc_cw1;

update kc a
set a.kc_cw=(select b.kc_cw1
from kc1 b
where a.kc_plbh = b.kc_plbh1
and a.kc_zh = b.kc_zh1 b.kc_cw is not null)
where a.kc_cw<>b.kc_cw1
以上兩個語法通不過。

update kc a
set a.kc_cw=(select b.kc_cw1
from kc1 b
where a.kc_plbh = b.kc_plbh1
and a.kc_zh = b.kc_zh1 )
where exists(select * from kc1 c where a.kc_plbh = c.kc_plbh1 and a.kc_zh = c.kc_zh1 and a.kc_cw <> c.kc_cw1)
正在運行中......
bai_jiong 2008-06-02
  • 打赏
  • 举报
回复
楼主可以试一下:

merge into kc
using kc1
on (kc.plbh=kc1.plbh1 and kc.kc_zh=kc1.kc_zh1 and kc.kc_cw<>kc1.kc_cw1)
when matched then
update set kc.kc_cw=kc1.kc_cw1;
postfxj 2008-06-02
  • 打赏
  • 举报
回复
都是非空的,兩個表的結構是一模一樣的,隻是kc_cw這裡的值不一樣了,我以kc1的為準。
alarmiss 2008-06-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 alarmiss 的回复:]
不好意思,把c.改成b.
空值的问题,如果kc_cw非空,那么kc_cw1最好也设为非空
如果kc_cw1没有非空约束,就添加条件
kc_cw1 is not null

SQL code
update kc a
set a.kc_cw=(select b.kc_cw1
from kc1 b
where a.kc_plbh = b.kc_plbh1
and a.kc_zh = b.kc_zh1 and b.kc_cw is not null)
where a.kc_cw<>b.kc_cw1
[/Quote]
......
alarmiss 2008-06-02
  • 打赏
  • 举报
回复
不好意思,把c.改成b.
空值的问题,如果kc_cw非空,那么kc_cw1最好也设为非空
如果kc_cw1没有非空约束,就添加条件
kc_cw1 is not null

update kc a
set a.kc_cw=(select b.kc_cw1
from kc1 b
where a.kc_plbh = b.kc_plbh1
and a.kc_zh = b.kc_zh1 b.kc_cw is not null)
where a.kc_cw<>b.kc_cw1


tjinjie 2008-06-02
  • 打赏
  • 举报
回复
UPDATE /*+BYPASS_UJVC*/ (SELECT T1.KC_CW1,
T2.KC_CW
FROM KC1 T1,
KC T2
WHERE KC_PLBH = KC_PLBH1
AND KC_ZH = KC_ZH1
AND KC_CW <> KC_CW1) J1
Set KC_CW = KC_CW1
试试这样....
postfxj 2008-06-02
  • 打赏
  • 举报
回复
這樣查不會有null值的。我看了。
我還這樣查看了
select *
from (
select kc_cw1 from kc1 where kc_plbh=kc_plbh1 and kc_zh=kc_zh1 and kc_cw <>kc_cw1 )
a
where kc_cw1 is null
這樣查後沒查到值。
jackiecheng001 2008-06-02
  • 打赏
  • 举报
回复
问题估计为:
select kc_cw1 from kc1 where kc_plbh=kc_plbh1 and kc_zh=kc_zh1 and kc_cw <>kc_cw1
产生了null

执行上述的,察看下结果集构成

postfxj 2008-06-02
  • 打赏
  • 举报
回复


update kc a
set a.kc_cw=(select b.kc_cw1
from kc1 b
where a.kc_plbh = b.kc_plbh1
and a.kc_zh = b.kc_zh1 )
where exists(select * from kc1 c where a.kc_plbh = c.kc_plbh1 and a.kc_zh = c.kc_zh1 and a.kc_cw <> c.kc_cw1)

postfxj 2008-06-02
  • 打赏
  • 举报
回复
c.kc_cw1中的c從哪來的,這樣寫對嗎?
alarmiss 2008-06-02
  • 打赏
  • 举报
回复

update kc a
set a.kc_cw=(select b.kc_cw1
from kc1 b
where a.kc_plbh = b.kc_plbh1
and a.kc_zh = b.kc_zh1 )
where a.kc_cw<>c.kc_cw1
postfxj 2008-06-02
  • 打赏
  • 举报
回复
我試試先。
tchx 2008-06-02
  • 打赏
  • 举报
回复
update kc a
set a.kc_cw=(select b.kc_cw1
from kc1 b
where a.kc_plbh = b.kc_plbh1
and a.kc_zh = b.kc_zh1 )
where exists(select 1 from kc1 c where a.kc_plbh = c.kc_plbh1 and a.kc_zh = c.kc_zh1 and a.kc_cw <> c.kc_cw1)



这样呢?将条件放外面

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧