楼主: zhrmghg

[精华] 一个UPDATE语句,请教SQL编写高手

[复制链接]
论坛徽章:
3
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
11#
 楼主| 发表于 2002-5-13 12:39 | 只看该作者
子查询可以用外面的表,外面不能用子查询里面的表,是不是这样理解?

确实不明白,还是看书查手册。

使用道具 举报

回复
论坛徽章:
0
12#
发表于 2002-6-10 16: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

使用道具 举报

回复
论坛徽章:
2
13#
发表于 2002-6-12 11: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行。

使用道具 举报

回复
论坛徽章:
3
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
14#
 楼主| 发表于 2002-6-12 12: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 ),第一句是错的,第二句是对的。

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
15#
发表于 2002-6-13 02: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;

使用道具 举报

回复
论坛徽章:
3
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
16#
 楼主| 发表于 2002-6-13 12:58 | 只看该作者
最初由 ydwangcn 发布
[B]这个方法应该也可以:

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; [/B]


这种方法是不对的,你试试。

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
17#
发表于 2002-6-13 15:20 | 只看该作者
我试过,如果col1和col2是a表的主键,我的方法是可行的。
并且也可以换成一条语句来完成:
update (select a.c2 a2,b.c2 b2 from a,b where a.c1=b.c1) set b2=a2;

使用道具 举报

回复
论坛徽章:
0
18#
发表于 2002-6-28 10: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>

使用道具 举报

回复
论坛徽章:
0
19#
发表于 2002-6-28 11:38 | 只看该作者

Study

Study

使用道具 举报

回复
论坛徽章:
0
20#
发表于 2002-6-28 15: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;

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表