SQL查询和优化(十五)

来源:互联网 发布:房产软件有哪些 编辑:程序博客网 时间:2024/06/07 14:23
我们来生成一些模拟数据如下:DROP TABLE t_object RURGE;DROP TABLE t_tables PURGE;CREATE TABLE t_objects AS SELECT * FROM dba_objects;CREATE TABLE t_tables AS SELECT * FROM dba_tables;ALTER TABLE t_objects ADD tablespace_name VARCHAR2(30);
现在需要把t_tables.tablespace_name 同步至 t_objects.talbespace_name,一般常用的是UPDARE:UPDATE t_objects o   SET o.tablespace_name =       (SELECT t.tablespace_name         FROM t_tables t        WHERE t.owner = o.owner AND t.table_name = o.object_name)WHERE EXISTS(SELECT t.tablespace_name        FROM t_tables t        WHERE t.owner = o.owner AND t.table_name = o.object_name);注意上面的写法:两个子查询要保持一致,这样不会更新新范围之外的数据,也容易维护
像这种关联更新一般要改为MERGE,因为UPDATE语句有两次扫描t_tables表,而且其中一次相当于标量子查询改写方法如下:1、目标表(t_objects o)放在MERGE INTO后面2、源表(t_tables)放在USING后面3、关联条件(t.owner = o.owner AND t.table_name = o.object_name)放在on后面,注意关联条件放在括号里,否则会报错。4、更新句子( SET o.tablespace_name = t.tablespace_name).注意:只能更新目标表,所以 o.tablespace_name一定要放在前面。MERGE INTO t_objects oUSING t_talbes t ON(t.owner = o.owner AND t.table_name = o.object_name)WHEN MATCHED THEN UPDATE   SET o.tablespace_name = t.tablespace_name;去掉了“标量子查询”,对t_tables只扫描了一次

选自《Oracle 查询优化改写技巧与案例》 有教无类 落落 著