表连接的update,经典?.txt
来自「oracle问题集」· 文本 代码 · 共 1,026 行 · 第 1/2 页
TXT
1,026 行
oracle文档
http://download-west.oracle.com/docs/cd/A87861_01/NT817EE/index.htm
由 THUNDER2 于 02-07-29 23:16 发表:
但觉得oracle在这方面还是有改善的余地
用起来限制比较多
由 biti_rainy 于 02-07-29 23: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>
__________________
I love oracle
But i hate IT
oracle文档
http://download-west.oracle.com/docs/cd/A87861_01/NT817EE/index.htm
由 biti_rainy 于 02-07-29 23:42 发表:
这里出现了一个实例,大家去解决一下吧 :)
http://www.itpub.net/showthread.php?s=&threadid=45975
__________________
I love oracle
But i hate IT
oracle文档
http://download-west.oracle.com/docs/cd/A87861_01/NT817EE/index.htm
由 violet 于 02-07-30 23:01 发表:
"当其中只有一个表有主键的时候
删除没有主键的表记录
当两个都有主键的时候
删除表连接中非驱动表的那个表
比如通常的rule模式下from a,b : 就删除a中的"
是删除没有主键的表记录,
但当两个都有主键时,为什么我做的时候会报错呀?
"主要是考虑到大表需要更新或者删除的时候
正好又要表连接为条件
因为在sybase数据库中是有这种功能的
很多人抱怨oracle没有这种功能
于是只能通过嵌套来解决
我希望这样效率能高一点"
今天正好用上了,真的快多了!
sybase 在这方面确实灵活多了,可是它没有集合运算.
由 biti_rainy 于 02-07-30 23:41 发表:
:)
也多谢你把我的想法实践了一把
至于有2个主键的问题,可能跟版本有关吧
我的是901
另: 始终是 from a,b : 就删除a中的
就算我给 select/*+ ORDERED USE_NL(tablename)*/ 提示也没有用,faint
__________________
I love oracle
But i hate IT
oracle文档
http://download-west.oracle.com/docs/cd/A87861_01/NT817EE/index.htm
由 yafeng 于 02-07-31 00:16 发表:
嘿嘿
这样的话,还是别用这种方法,万一搞错了怎么办。版本升级了怎么办。
__________________
我还是一个人在这条没有退路的沙漠中奔跑
虽然我也知道这个沙漠的后面
是另外一个沙漠
但是我还是要自己去试试
这些事情没有对与错
只是没想到
一个人走的那么的孤独
----东邪西毒
由 rfeng 于 02-07-31 22:15 发表:
问题还是出来了哦:
问题是这样的,rainy 说的如果两个表中都有主键,则删除
非驱动表中的行,但是我下面的应用却删除了驱动表中的
应用,这是怎么会事呢?应用在下面显示:
SQL> alter table test2 drop primary key;
Table altered
SQL> alter table test2 add primary key(record);
Table altered
SQL> alter table test1 drop primary key;
Table altered
SQL> alter table test1 add primary key(num);
Table altered
SQL> desc test1;
Name Type Nullable Default Comments
---- ------------ -------- ------- --------
NUM NUMBER
NAME VARCHAR2(20) Y
SQL> desc test2;
Name Type Nullable Default Comments
------ ------------ -------- ------- --------
NUM NUMBER Y
NAME VARCHAR2(20) Y
RECORD NUMBER 0
SQL> select * from test1;
NUM NAME
---------- --------------------
701 zhangming
702 chenhua
704 penghui
709 xiaojun
721 likaixia
SQL> select * from test2;\
NUM NAME RECORD
---------- -------------------- ----------
701 zhangming 1
702 chenhua 2
704 pe454434i 3
709 xi455un 4
721 likaixia 5
704 penghui 6
709 xi32545un 7
721 likaixia 8
8 rows selected
SQL> delete (select a.num a1,a.name a2,b.num b1,b.name b2,b.record b3 from test1
a,test2 b where b.num = a.num)where b1 = 704;
2 rows deleted
SQL> select * from test1;
NUM NAME
---------- --------------------
701 zhangming
702 chenhua
704 penghui
709 xiaojun
721 likaixia
SQL> select * from test2;
NUM NAME RECORD
---------- -------------------- ----------
701 zhangming 1
702 chenhua 2
709 xi455un 4
721 likaixia 5
709 xi32545un 7
721 likaixia 8
6 rows selected
SQL>
其中test2中NUM=704的两行被delete掉了哦!这可不是
我们所期望的呀!
大家看看问题出现在什么地方?
__________________
……HELLO * ORACLE……
由 rfeng 于 02-07-31 22:27 发表:
quote:
最初由 violet 发布
"当其中只有一个表有主键的时候
删除没有主键的表记录
当两个都有主键的时候
删除表连接中非驱动表的那个表
比如通常的rule模式下from a,b : 就删除a中的"
是删除没有主键的表记录,
<B>但当两个都有主键时,为什么我做的时候会报错呀?</B>
"主要是考虑到大表需要更新或者删除的时候
正好又要表连接为条件
因为在sybase数据库中是有这种功能的
很多人抱怨oracle没有这种功能
于是只能通过嵌套来解决
我希望这样效率能高一点"
今天正好用上了,真的快多了!
sybase 在这方面确实灵活多了,可是它没有集合运算.
两个表都有主键的话,有时候会报错ora-1752错误:
ORA-01752: 不能从没有一个键值保存表的视图中删除
有时候就不会,我上面的例子中就没有报错,但曾经也有过
报错的时候,比较奇怪!!! :)
__________________
……HELLO * ORACLE……
由 biti_rainy 于 02-07-31 22:35 发表:
我的关于 驱动表 的说法
我不敢保证是否正确
因为,本来我想利用 sql_trace 追踪并用 tkprof查看的
因为 就算 set autotrace on 的结果也未必是正确的
只可以,我机器上居然没有 tkprof,真郁闷
我想看到底是删除哪个表,是否有比较可靠的依据
有兴趣你可以做频繁实验找出规律来
__________________
I love oracle
But i hate IT
oracle文档
http://download-west.oracle.com/docs/cd/A87861_01/NT817EE/index.htm
由 rfeng 于 02-07-31 22:56 发表:
Re: 我的关于 驱动表 的说法
quote:
最初由 biti_rainy 发布
我不敢保证是否正确
因为,本来我想利用 sql_trace 追踪并用 tkprof查看的
因为 就算 set autotrace on 的结果也未必是正确的
只可以,我机器上居然没有 tkprof,真郁闷
我想看到底是删除哪个表,是否有比较可靠的依据
有兴趣你可以做频繁实验找出规律来
rainy大哥,我已经搞了两天了,我改到这一步:
把where子句中的字段分别定义成各个表的主键,然后再做
delete,结果还是比较失望…… :(
你说的sql_trace我没有用过哦,不好意思,tkprof 还没有听说
过了哦,怎么做追踪测试呢?
__________________
……HELLO * ORACLE……
由 biti_rainy 于 02-07-31 23:19 发表:
sql_trace 追踪并用 tkprof查看
tuning 部分的内容
追踪sql的实际执行计划和详细的资源消耗等状况
慢慢一步一步来吧
__________________
I love oracle
But i hate IT
oracle文档
http://download-west.oracle.com/docs/cd/A87861_01/NT817EE/index.htm
由 rfeng 于 02-07-31 23:26 发表:
Re: sql_trace 追踪并用 tkprof查看
quote:
最初由 biti_rainy 发布
tuning 部分的内容
追踪sql的实际执行计划和详细的资源消耗等状况
慢慢一步一步来吧
tkprof在那里找到,我使用的环境是ora8。1。7 plsql语言
我找到了sql trace,但是没有看到tkprof哦! :)
再次请教rainy 大哥哦!
__________________
……HELLO * ORACLE……
由 THUNDER2 于 02-07-31 23:51 发表:
9i 的规则改变了
Oracle9i Database README Release Notes
26.0 MATERIALIZED VIEWS
26.1 Updating a Join View
The delete rules for updatable join views have been changed in Oracle9i. It is
now possible to delete from an updatable join view when the join view contains
more than one key-preserved tables. In this case, Oracle9i uses the first table
appearing in the from clause of the updatable join view as the target of the
delete operation.
For example:
delete from
(select rowid
from orders o, okey ok
where o.orderkey = ok.orderkey);
If both tables are key-preserved (that is, a unique index exists on the orderkey
column for both tables), Oracle9i will resolve the ambiguity by assuming that
the target of the delete operation is the table order, as it appears first in
the from clause of the updatable join view. The same rule also applies to
updatable join views using the WITH CHECK OPTION clause.
For more information on updatable join views and key-preserved tables, please
refer to section "Managing Views, Sequences and Synonyms" in the Oracle9i
Database Administrator's Guide.
由 xiexudong 于 02-10-29 19:06 发表:
但是我的col2是含有空值的,无法建立主键。
所有时间均为 +8 hours . 现在时间是 17:18.
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 + =
减小字号Ctrl + -
显示快捷键?