⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 一个update语句,请教sql编写高手.txt

📁 oracle问题集
💻 TXT
字号:
ITPUB论坛 - 一个UPDATE语句,请教SQL编写高手
ITPUB论坛 (http://www.itpub.net/index.php)
- Oracle开发 (http://www.itpub.net/forumdisplay.php?forumid=3)
-- 一个UPDATE语句,请教SQL编写高手 (http://www.itpub.net/showthread.php?threadid=30168)


由 zhrmghg 于 02-05-13 18:07 发表: 
一个UPDATE语句,请教SQL编写高手
有两个表,a和b,都有三个字段,col1,col2,col3,
col1和col2是primary key。

a表的三个字段都有数据,b表的col1和col2有数据,col3没有数据。
a表的col1和col2的数据和b表的一致。

现在想根据a.col1=b.col1 and a.col2=b.col2的条件检索出a.col3的数据,update b.col3



试了很多SQL,都不行,有没有高手愿意指点一下,


由 meteor2100 于 02-05-13 18:22 发表: 
update b
set col3 = (select a.col3 from a,b
where a.col1=b.col1 and a.col2=b.col2)
不知到可不可以?


由 zhrmghg 于 02-05-13 18:29 发表: 
不行,出错信息是,ORA-01427:单行子查询返回多于一行
__________________
------未经沧海难为水-----
------除却巫山还是云-----


由 j6j6 于 02-05-13 18:43 发表: 
偶知道SQL Server 下可以这样写的
update b set col3 = a.col3
from a,b
where a.col1=b.col1 and a.col2=b.col2


由 biti_rainy 于 02-05-13 18:57 发表: 
hehe
update b bb
set bb.col3 = (select aa.col3 from a aa
where aa.col1=bb.col1 and aa.col2=bb.col2)
__________________
I love oracle
But i hate IT

oracle文档
http://tahiti.oracle.com/pls/tahiti/tahiti.homepage?remark=tahiti


由 meteor2100 于 02-05-13 19:09 发表: 
update b 
set col3 = (select col3 from a
where a.col1=b.col1 and a.col2=b.col2)

或:
declare
v_col1 a.col1%type;
v_col2 a.col2%type;
v_col3 a.col3%type;
cursor cur_up is
select col1,col2,col3 from a;
begin
open cur_up;
loop
fetch cur_up into v_col1,v_col2,v_col3;
exit when cur_up%notfound;
update b set col3=v_col3
where col1=v_col1 and col2=v_col2;
end loop;
close cur_up;
commit;
end;

如果还是不行,我想我只能手工一行一行的update了。


由 zhrmghg 于 02-05-13 19:45 发表: 
j6j6,ORA-00933:SQL命令未正确结束
biti_rainy 和 meteor2100 的方法正确,多谢两位。

请教一下,为什么我写的这个会不对,前面的一样,但是我加上了条件,就出现ORA-00904:无效列名 的错误。
update b set b.col3 = (select a.col3 from a
where a.col1=b.col1 and a.col2=b.col2)
where a.col1=b.col1 and a.col2=b.col2 --我加上的条件,会出现无效列名错误
__________________
------未经沧海难为水-----
------除却巫山还是云-----


由 easyfree 于 02-05-13 19:48 发表: 
  quote:

  最初由 zhrmghg 发布
  j6j6,ORA-00933:SQL命令未正确结束
  biti_rainy 和 meteor2100 的方法正确,多谢两位。

  请教一下,为什么我写的这个会不对,前面的一样,但是我加上了条件,就出现ORA-00904:无效列名 的错误。
  update b set b.col3 = (select a.col3 from a
  where a.col1=b.col1 and a.col2=b.col2)
  where a.col1=b.col1 and a.col2=b.col2 --我加上的条件,会出现无效列名错误 




很简单, 你这句条件里面的a是谁? 你知道, Oracle可不知道 
__________________

生年不满百,常怀千岁忧。
昼短苦夜长,何不秉烛游!
为乐当及时,何能待来兹?
愚者爱惜费,但为后世嗤。
仙人王子乔,难可与等期。



由 zhrmghg 于 02-05-13 20:13 发表: 
a,b都是表名,当然实际中不是用这个表名
__________________
------未经沧海难为水-----
------除却巫山还是云-----


由 easyfree 于 02-05-13 20:30 发表: 
  quote:

  最初由 zhrmghg 发布
  a,b都是表名,当然实际中不是用这个表名 




唉, 看来你还是没有明白, Oracle当然知道a, b都是表名, 但问题是a这个表Oracle找不到, 因为你的条件是写在子查询之外的
__________________

生年不满百,常怀千岁忧。
昼短苦夜长,何不秉烛游!
为乐当及时,何能待来兹?
愚者爱惜费,但为后世嗤。
仙人王子乔,难可与等期。



由 zhrmghg 于 02-05-13 20:39 发表: 
子查询可以用外面的表,外面不能用子查询里面的表,是不是这样理解?

确实不明白,还是看书查手册。
__________________
------未经沧海难为水-----
------除却巫山还是云-----


由 seeme 于 02-06-11 00:44 发表: 
这样写应该就对了
update b 
set col3 = (select a.col3 from a,b where a.col1=b.col1 and a.col2=b.col2) 
where col1=a.col1 and col2=a.col2


由 Orazhuys 于 02-06-12 19:41 发表: 
 奇怪,我怎么能更新啊?呵呵
win2kserver+oracle8.1.5

SQL> create table a(col1 number,col2 number,col3 number);

表已创建。
SQL> alter table a add(primary key(col1,col2));

表已更改。

SQL> insert into a values(1,2,3);

已创建 1 行。

SQL> c/1,2,3/2,3,4
1* insert into a values(2,3,4)
SQL> /

已创建 1 行。

SQL> c/2,3,4/3,4,5
1* insert into a values(3,4,5)
SQL> /

已创建 1 行。

SQL> c/3,4,5/4,5,6
1* insert into a values(4,5,6)
SQL> /

已创建 1 行。

SQL> c/4,5,6/5,6,7
1* insert into a values(5,6,7)
SQL> /

已创建 1 行。

SQL> c/5,6,7/6,7,8
1* insert into a values(6,7,8)
SQL> /

已创建 1 行。

SQL> commit;

提交完成。

SQL> create table b as select col1,col2 from a;

表已创建。

SQL> alter table b add(col3 number);

表已更改。

SQL> desc b;
名称 空值? 类型
----------------------------------------- -------- ----------------------------
COL1 NUMBER
COL2 NUMBER
COL3 NUMBER

SQL> select * from b;


COL1 COL2 COL3
--------- --------- ---------
1 2
2 3
3 4
4 5
5 6
6 7

已选择6行。

SQL> update b set col3=(select col3 from a where a.col1=b.col1 and 
a.col2=b.col2);

已更新6行。

SQL> select * from b;


COL1 COL2 COL3
--------- --------- ---------
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7
6 7 8

已选择6行。
__________________
--------------------------------------------------------
为什么老实成了“无能”的代名词,这是因为“狡诈”悄悄地占据了社会的合法地位。


由 zhrmghg 于 02-06-12 20:29 发表: 
update b 
set col3 = (select a.col3 from a,b 
where a.col1=b.col1 and a.col2=b.col2) 

update b
set col3 = (select a.col3 from a
where a.col1=b.col1 and a.col2=b.col2)

注意上面两条语句的不同(子查询里面的from ),第一句是错的,第二句是对的。
__________________
------未经沧海难为水-----
------除却巫山还是云-----


由 ydwangcn 于 02-06-13 10:32 发表: 
这个方法应该也可以:

create view v_ab as 
select a.col3 a3, b.col3 b3 from a,b
where a.col1=b.col1 and a.col2=b.col2;

update v_ab set b3=a3;
commit;

drop view v_ab;


由 zhrmghg 于 02-06-13 20:58 发表: 
  quote:

  最初由 ydwangcn 发布
  这个方法应该也可以:

  create view v_ab as 
  select a.col3 a3, b.col3 b3 from a,b
  where a.col1=b.col1 and a.col2=b.col2;

  update v_ab set b3=a3;
  commit;

  drop view v_ab; 




这种方法是不对的,你试试。
__________________
------未经沧海难为水-----
------除却巫山还是云-----


由 ydwangcn 于 02-06-13 23:20 发表: 
我试过,如果col1和col2是a表的主键,我的方法是可行的。
并且也可以换成一条语句来完成:
update (select a.c2 a2,b.c2 b2 from a,b where a.c1=b.c1) set b2=a2;


由 porridge 于 02-06-28 18:52 发表: 
如zhrmghg所说的好像也不行.
我现在有两表:bm,luquku,均有ksh,kldm两字段,
luquku中的kldm为空,想把bm中的kldm按照bm.ksh=luquku.ksh拷贝过去
结果好像不行,过程如下:
SQL> select bm.kldm from bm,luquku where bm.ksh = luquku.ksh;

KL
--
5
5
5
5
5
5
5
5
5

已选择9行。

SQL> update luquku set luquku.kldm = (select bm.kldm from bm where bm.ksh = 
luquku.ksh and rownum = 1);

已更新9行。

SQL> select distinct kldm from luquku;

KLDM
----


SQL> update luquku set luquku.kldm = (select bm.kldm from bm where bm.ksh = 
luquku.ksh);

已更新9行。

SQL> select distinct kldm from luquku;

KLDM
----


SQL>
__________________
号子里现在放风,出来透透气


由 typyj 于 02-06-28 19:38 发表: 
Study
Study


由 pfox 于 02-06-28 23:38 发表: 
这样写:
UPDATE B 
SET COL3=(
SELECT COL3 
FROM A 
WHERE B.COL1=A.COL1 
AND B.COL2=A.COL2)
WHERE B.COL1||B.COL2 IN (
SELECT A.COL1||A.COL2 
FROM A 
WHERE A.COL1=B.COL1 
AND A.COL2=B.COL2);

COMMIT;


由 graydolphin 于 02-06-29 21:06 发表: 
有时我用这种方法
update ( select a.col3 a_col3, b.col3 b_col3 from a, b where a.col1=b.col1 and 
a.col2= b.col2)
set b_col3 = a_col3


由 kanmi 于 02-07-02 17:19 发表: 
我个人觉得这种update应有规则,比如
a 表:
col1 col2 col3
1 2 3
1 2 4
1 2 5
B表:
col1 col2 col3
1 2 
1 2 
这种情况需要规则的,否则update后的数据不一定是想要。


由 pfox 于 02-07-02 21:28 发表: 
  quote:

  最初由 kanmi 发布
  我个人觉得这种update应有规则,比如
  a 表:
  col1 col2 col3
  1 2 3
  1 2 4
  1 2 5
  B表:
  col1 col2 col3
  1 2 
  1 2 
  这种情况需要规则的,否则update后的数据不一定是想要。 





我这样写就可以解决问题,我试了,数据正确。

UPDATE B 
SET COL3=( 
SELECT COL3 
FROM A 
WHERE B.COL1=A.COL1 
AND B.COL2=A.COL2) 
WHERE B.COL1||B.COL2 IN ( 
SELECT A.COL1||A.COL2 
FROM A 
WHERE A.COL1=B.COL1 
AND A.COL2=B.COL2);


由 dreamofsea 于 02-10-23 22:26 发表: 
update b
set col3 = (select a.col3 from a
where a.col1=b.col1 and a.col2=b.col2)
where (b.col1,b.col2) in (select col1,col2 from a);

最后的那个where子句是一定要的。



所有时间均为 +8 hours . 现在时间是 19:52.
Powered by: vBulletin Version 2.0.1
Translated and hacked by:Ztbbs.
Copyright © Jelsoft Enterprises Limited 2000, 2001.
Copyright by itpub.net 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -