楼主: biti_rainy

[精华] 表连接的update,经典?

[复制链接]
论坛徽章:
4
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2006-05-19 12:39:15行业板块每日发贴之星
日期:2006-11-17 01:08:18
11#
发表于 2002-7-29 14:37 | 只看该作者

这里还行不通

我这样测试的,你看还是有问题的,不如触发器方便了。

SQL> desc ww;
Name Type        Nullable Default Comments
---- ----------- -------- ------- --------
NAME VARCHAR2(8)                           
NUM  NUMBER                                

SQL> desc ww1;
Name Type        Nullable Default Comments
---- ----------- -------- ------- --------
NAME VARCHAR2(8)                           
NUM  NUMBER                                

SQL> select * from ww;

NAME                                         NUM
-------- ---------------------------------------
wang                                         999
zhang                                     123434
w                                              2
chen                                          13
wang                                        8247
wang                                        9837
wang                                       34813

7 rows selected

SQL> select * from ww1;

NAME                                         NUM
-------- ---------------------------------------
wang                                           0
chen                                          13
wang                                        8247
wang                                        9837
wang                                       34813

SQL> delete (select a.name aa,a.num ab,b.name ba,b.num bb from ww a,ww1 b where a.name = b.name and a.num = b.num) where ab = 9837;

delete (select a.name aa,a.num ab,b.name ba,b.num bb from ww a,ww1 b where a.name = b.name and a.num = b.num) where ab = 9837

ORA-01752: 不能从没有一个键值保存表的视图中删除

附注:两个表的主键都是组合主键。

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
12#
发表于 2002-7-29 14:47 | 只看该作者

rainy ,我知道怎么回事啦

我建了2个表test,test1  都在a 上建立了主踺

SQL> select * from test1;
         A          B
---------- ----------
         1          2
         2          2
SQL> select * from test;
         A          B
---------- ----------
         1          1
         2          1
         3          1

SQL>delete (select a.a aa,a.b ab,b.a from test b,test1 a where b.a = a.a );
ORA-01752: cannot delete from view without exactly one key-preserved table
我就奇怪明明2个表都是key-preserved table啊,再查了一下oracle错误文档:
ORA-01752 cannot delete from view without exactly one key-preserved table
Cause: The deleted table either had no key preserved tables, [B]had more than one key-preserved table[/B] , or the key-preserved table was an unmerged view or a table from a read-only view.

恍然大悟join view 中不能同时存在多于1个key-preserved table
sql>alter table test1 drop primary key;
Table altered.
SQL> delete (select a.a aa,a.b ab,b.a from test b,test1 a where b.a = a.a );
2 rows deleted.
SQL> select * from test;
         A          B
---------- ----------
         3          1

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
13#
发表于 2002-7-29 14:52 | 只看该作者

继续

SQL> rollback;

Rollback complete.

SQL> alter table test add primary key(a);

Table altered.

SQL> alter table test1 drop primary key;

Table altered.

SQL> delete (select a.a aa,a.b ab,b.a from test b,test1 a where b.a = a.a );

2 rows deleted.

SQL> select * from test;

         A          B
---------- ----------
         1          1
         2          1
         3          1

SQL> select * from test1;

no rows selected

只会更新key perserved table

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
14#
 楼主| 发表于 2002-7-29 15:09 | 只看该作者

呵呵

只要大家明白就可以了

BTW:至于关于触发器的说法
我没有明白怎么跟触发器扯上关系了
我对于这种方式的提议
并不是为了炫耀sql怎么华丽
主要是考虑到大表需要更新或者删除的时候
正好又要表连接为条件
因为在sybase数据库中是有这种功能的
很多人抱怨oracle没有这种功能
于是只能通过嵌套来解决
我希望这样效率能高一点

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
15#
发表于 2002-7-29 15:16 | 只看该作者

但觉得oracle在这方面还是有改善的余地

用起来限制比较多

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
16#
 楼主| 发表于 2002-7-29 15:20 | 只看该作者

我明白了,我的结果

当其中只有一个表有主键的时候
删除没有主键的表记录

当两个都有主键的时候
删除表连接中非驱动表的那个表
比如通常的rule模式下from  a,b : 就删除a中的
SQL> delete (select a.a aa,a.b ab,b.a from test b,test1 a where b.a = a.a ) where aa =1;
delete (select a.a aa,a.b ab,b.a from test b,test1 a where b.a = a.a ) where aa =1
       *
ERROR 位于第 1 行:
ORA-01752: 不能从没有一个键值保存表的视图中删除


已用时间:  00: 00: 00.00
SQL> alter table test1 add primary key(a);

表已更改。

已用时间:  00: 00: 00.00
SQL>  delete (select a.a aa,a.b ab,b.a from test b,test1 a where b.a = a.a ) where aa =1;

已删除 1 行。

已用时间:  00: 00: 00.00
SQL> select  *from test1;

         A B
---------- --------------------
         1 1
         3 3
         2 2

已用时间:  00: 00: 00.00
SQL> select * from test;

         A          B          C
---------- ---------- ----------
         2          2          1
         4          4          2
         6          1          3
         8          4          4

已用时间:  00: 00: 00.00
SQL> rollback;

回退已完成。

已用时间:  00: 00: 00.00
SQL> alter table test1 drop primary key ;

表已更改。

已用时间:  00: 00: 00.00
SQL> alter table test add primary key(a);

表已更改。

已用时间:  00: 00: 00.00
SQL>  delete (select a.a aa,a.b ab,b.a from test b,test1 a where b.a = a.a ) where aa =1;

已删除 1 行。

已用时间:  00: 00: 00.00
SQL> select * from test1;

         A B
---------- --------------------
         3 3
         2 2

已用时间:  00: 00: 00.00
SQL> select * from test;

         A          B          C
---------- ---------- ----------
         1          1          0
         2          2          1
         4          4          2
         6          1          3
         8          4          4

已用时间:  00: 00: 00.00
SQL> rollback;

回退已完成。

已用时间:  00: 00: 00.00
SQL> alter table test1 add primary key(a);

表已更改。

已用时间:  00: 00: 00.00
SQL>  delete (select a.a aa,a.b ab,b.a from test b,test1 a where b.a = a.a ) where aa =1;

已删除 1 行。

已用时间:  00: 00: 00.00
SQL> select * from test;

         A          B          C
---------- ---------- ----------
         2          2          1
         4          4          2
         6          1          3
         8          4          4

已用时间:  00: 00: 00.00
SQL> select * from test1;

         A B
---------- --------------------
         1 1
         3 3
         2 2

已用时间:  00: 00: 00.00
SQL> rollback;

回退已完成。

已用时间:  00: 00: 00.00
SQL> delete (select a.a aa,a.b ab,b.a from test1 b,test a where b.a = a.a ) where aa =1;

已删除 1 行。

已用时间:  00: 00: 00.00
SQL> select * from test1;

         A B
---------- --------------------
         3 3
         2 2

已用时间:  00: 00: 00.00
SQL> select * from test;

         A          B          C
---------- ---------- ----------
         1          1          0
         2          2          1
         4          4          2
         6          1          3
         8          4          4

已用时间:  00: 00: 00.00
SQL> rollback;

回退已完成。

已用时间:  00: 00: 00.00
SQL>

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
17#
 楼主| 发表于 2002-7-29 15:42 | 只看该作者

这里出现了一个实例,大家去解决一下吧 :)

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
18#
发表于 2002-7-30 15:01 | 只看该作者
"当其中只有一个表有主键的时候
删除没有主键的表记录

当两个都有主键的时候
删除表连接中非驱动表的那个表
比如通常的rule模式下from a,b : 就删除a中的"


是删除没有主键的表记录,
但当两个都有主键时,为什么我做的时候会报错呀?


"主要是考虑到大表需要更新或者删除的时候
正好又要表连接为条件
因为在sybase数据库中是有这种功能的
很多人抱怨oracle没有这种功能
于是只能通过嵌套来解决
我希望这样效率能高一点"

今天正好用上了,真的快多了!
sybase 在这方面确实灵活多了,可是它没有集合运算.

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
19#
 楼主| 发表于 2002-7-30 15:41 | 只看该作者

:)

也多谢你把我的想法实践了一把  

至于有2个主键的问题,可能跟版本有关吧
我的是901

另: 始终是  from a,b : 就删除a中的
就算我给  select/*+ ORDERED USE_NL(tablename)*/ 提示也没有用,faint

使用道具 举报

回复
论坛徽章:
70
三菱
日期:2014-01-17 10:00:292014年世界杯参赛球队: 智利
日期:2014-06-05 11:54:32马上加薪
日期:2014-04-07 17:03:21马上有钱
日期:2014-02-25 21:39:36马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:11
20#
发表于 2002-7-30 16:16 | 只看该作者
嘿嘿
这样的话,还是别用这种方法,万一搞错了怎么办。版本升级了怎么办。

使用道具 举报

回复

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

本版积分规则 发表回复

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