2004-10-20 22:53:13
单行日期函数
|
??xml version="1.0" encoding="utf-8" standalone="yes"?>
一、简?BR>
MTSQMulti-Threaded ServerQ是ORACLE SERVER的一个可选的配置选择Q是相对DEDICATE方式而言Q它最大的优点是在以不用增加物理资源(内存Q的前提下支持更多的q发的连接。换句话_如果你只?G的物理内存,而你又想支持2000个连接,在获取最好性能的前提下Q你应该选择MTS了?BR>
本文先说一说MTS的工作方式,然后与DEDICATE方式的做一下比较,接下来说一下MTS具体配置实现Q最后说一些优化MTS配置选项的问题?BR>
二、MTS的工作方?BR>
1、Joseph C.Johnson以餐馆给Z个MTS的Ş象的比喻
假设ORACLE是一安馆,当你走进一安馆时你感觉最舒服的服务方式就是有一个专门的waiter来ؓ你服务,而不餐馆中来了多少人,她只对你h应答Q这是DEDICTE的处理方式,也就是说每一个ORACLE客户端的q接都有一个专门的服务q程来ؓ它服务。而大部的馆的服方式都不是一对一的,当你走进的时侯,你就被指定了一个waiterQ她也可能ؓ其它桌服着务,q对于餐馆来说是最有利的,因ؓ他们可以服务更多的客不需要增加他们的员工。这样对你来说也可能是不错的Q如果餐馆不是太忙,Ҏ(gu)务的客h的请求都很简短且Ҏ(gu)完成Q你的感觉也好像自己拥有一个专门的waiterQwaiter把你的ORDER转给厨师Q然后把做好的菜拿给你,q就是MTS的处理方式,q些׃n的waiters我们叫她们ؓDispatchersQ厨师我们则叫他们ؓShared Server Processes?BR>
2、以图说一下MTS的工作方?SYBEX书中的一q图)
1)客户端向Dispatcher发一个服务请?BR>
2)Dispatch把这个请求放到SGA区的h寚w列中
3)׃个或几个服务q程来处理这个请?BR>
4)服务q程把进行的l果攑ֈDispatch的SGA区的的响应队列中
5)Dispatcher从响应队列拾L(fng)?BR>
6)完成客户端的hq把l果回送给客户?BR>
三、MTS与DEDICATE方式斚w做一下比较,为方便比较绘制如下的?BR>
序号 |
比较?/SPAN> |
MTS方式 |
DEDICATE方式 |
1 |
服务q程 |
多个q接׃n一个服务进E?/SPAN> |
一个连接有一个专门的服务q程 |
2 |
每个客户端的q接使用的内存量 |
3-4M |
150-200K |
3 |
适合的应用环?/SPAN> |
适合q接数很多且h很短的OLTP环境 |
如果Oracle服务器的资源够用Q这U方式是优?/SPAN> |
4 |
CPU负蝲 |
会造成一?/SPAN>CPU的负载,如果你的CPU有瓶颈,则不要用q种方式 |
|
2004-10-20 22:53:13
单行日期函数
|
我的试环境:Hp rp7410LQHp-unix11.11 OS,Oracle8.1.7.4的数据库,一个有90张表大约100G的测试表I间TBS_TEST.
问题的提?/STRONG>QOracle中在使用drop tablespace <tablespace_name> including contents;删除数据字典理的表I间时存在着很大的效率问题?/P>
试开? 1、用drop tablespace <tablespace_name> including contents;方式直接来删? SQL>set linesize 132 已用旉: 03: 35: 39.10 l过我耐心的等待,׃三个半小时?nbsp; 2、测一下同L(fng)表空_把它转换为Local方式理的删除效率?/STRONG> a、把TBS_TEST通过恢复回来?/P>
b、把TBS_TEST转化为Local理的方式?/P>
SQL>set timing on 已用旉: 00: 06: 33.25 c、删个空间?/P>
SQL> drop tablespace TBS_TEST including contents 可以看到d才花费了7分多钟?/P>
3、测一下同L(fng)表空_先删除其中的对象Q然后再删这个表I间的效率如何?/STRONG> a、把TBS_TEST通过恢复回来?/P>
b、Ş成删除表的语?/P>
SQL>set linesize 132 c、删除表 q一步大U花?0U?/P>
d、删个空间?/P>
SQL>set timing on 已用旉: 00: 07: 35.53
SQL>set pagezie 0
SQL>set timing on
SQL>drop tablespace TBS_TEST including contents
2 /
SQL> exec sys.dbms_space_admin.tablespace_migrate_to_local('TBS_TEST') ;
2 /
已用旉: 00: 00: 45.56
SQL>set pagezie 0
SQL>set timing off
SQL>spool drop_test_tables.sql
SQL>SELECT 'Drop table '||TABLE_name||';' FROM dba_tables WHERE tablespace_name='TBS_TEST';
SQL>spool off
SQL>@drop_test_tables.sql
SQL> drop tablespace TBS_TEST including contents;
可以看到d才花费了近8分钟?/P>
ȝQ我们在做数据字典管理的表空间的删除Ӟ最好先删除表空间中的对象再q行删除该表I间操作。也可以先把它{换ؓ本地(local)理的空间再q行删除。不q需要补充的是本地管理的I间?i以后的版本中才是有的?BR>
作者BlogQ?/STRONG>http://blog.csdn.net/hrb_qiuyb/
Oracle DECODE & CASE Functions |
|
Version 10.1 |
Note: Decode and Case are very similar in their appearance but can produce very different results. | |
Demo Tables & Data | |
Decode Built-in Function | |
Simple DECODE | SELECT DECODE (value, <if this value>, <return this value>) FROM dual; |
SELECT program_id, DECODE(customer_id, 'AAL', 'American Airlines') AIRLINE, delivered_date FROM airplanes WHERE ROWNUM < 11; | |
More Complex DECODE | SELECT DECODE (value,<if this value>,<return this value>, <if this value>,<return this value>, ....) FROM dual; |
SELECT program_id, DECODE(customer_id, 'AAL', 'American Airlines', 'ILC', 'Intl. Leasing Corp.', 'NWO', 'Northwest Orient', 'SAL', 'Southwest Airlines', 'SWA', 'Sweptwing Airlines', 'USAF', 'U.S. Air Force') AIRLINE, delivered_date FROM airplanes WHERE ROWNUM < 11; | |
DEOCODE with DEFAULT | SELECT DECODE (value,<if this value>,<return this value>, <if this value>,<return this value>, .... <otherwise this value>) FROM dual; |
SELECT program_id, DECODE(customer_id, 'AAL', 'American Airlines', 'ILC', 'Intl. Leasing Corp.', 'NWO', 'Northwest Orient', 'SAL', 'Southwest Airlines', 'SWA', 'Sweptwing Airlines', 'USAF', 'United States Airforce', 'Not Known') AIRLINE, delivered_date FROM airplanes WHERE ROWNUM < 11; | |
Simple DECODE Crosstab Note how each decode only looks at a single possible value and turns it into a new column |
SELECT program_id, DECODE(customer_id, 'AAL', 'AAL') AMERICAN, DECODE(customer_id, 'DAL', 'DAL') DELTA, DECODE(customer_id, 'NWO', 'NWO') NORTHWEST, DECODE(customer_id, 'ILC', 'ILC') INTL_LEASING FROM airplanes WHERE rownum < 20; |
DECODE as an in-line view with crosstab summation | The above DECODE, in blue, used as an in-line view |
SELECT program_id, COUNT (AMERICAN) AAL, COUNT (DELTA) DAL, COUNT (NORTHWEST) NWO, COUNT(INTL_LEASING) ILC FROM ( SELECT program_id, DECODE(customer_id, 'AAL', 'AAL') AMERICAN, DECODE(customer_id, 'DAL', 'DAL') DELTA, DECODE(customer_id, 'NWO', 'NWO') NORTHWEST, DECODE(customer_id, 'ILC', 'ILC') INTL_LEASING FROM airplanes) GROUP BY program_id; | |
Query for DECODE demo | CREATE TABLE stores ( store_name VARCHAR2(20), region_dir NUMBER(5), region_mgr NUMBER(5), store_mgr1 NUMBER(5), store_mgr2 NUMBER(5), asst_storemgr1 NUMBER(5), asst_storemgr2 NUMBER(5), asst_storemgr3 NUMBER(5)) TABLESPACE data_sml; INSERT INTO stores VALUES ('San Francisco',100,200,301,302,401,0,403); INSERT INTO stores VALUES ('Oakland',100,200,301,0,404,0,0); INSERT INTO stores VALUES ('Palo Alto',100,200,0,305,0,405,406); INSERT INTO stores VALUES ('Santa Clara',100,250,0,306,0,0,407); COMMIT; SELECT DECODE(asst_storemgr1, 0, DECODE(asst_storemgr2, 0, DECODE(asst_storemgr3, 0, 0, asst_storemgr3), asst_storemgr2), asst_storemgr1) ASST_MANAGER, DECODE(store_mgr1,0, DECODE(store_mgr2,0, 0, store_mgr2), store_mgr1) STORE_MANAGER, REGION_MGR, REGION_DIR FROM stores; |
DECODE with Summary Function | SELECT SUM(CA_COUNT) CA, SUM(TX_COUNT) TX FROM ( SELECT state, DECODE(state, 'CA', COUNT(*), 0) CA_COUNT, DECODE(state, 'TX', COUNT(*), 0) TX_COUNT FROM locations GROUP BY state); |
DECODE in the WHERE Clause |
set serveroutput on |
Case Built-in Function | |
Simple CASE Demo | SELECT CASE WHEN (<column_value> = <value>) THEN WHEN (<column_value> = <value>) THEN ELSE <value> FROM <table_name>; |
SELECT line_number, CASE WHEN (line_number = 1) THEN 'One' WHEN (line_number = 2) THEN 'Two' ELSE 'More Than Two' END AS RESULTSET FROM airplanes; | |
More Complex CASE Demo With Between | SELECT CASE WHEN (<column_value> BETWEEN <value> AND <value>) THEN WHEN (<column_value> BETWEEN <value> AND <value>) THEN ELSE <value> FROM <table_name>; |
SELECT line_number, CASE WHEN (line_number BETWEEN 1 AND 10) THEN 'One' WHEN (line_number BETWEEN 11 AND 100) THEN 'Big' ELSE 'Bigger' END FROM airplanes; | |
More Complex CASE Demo With Booleans | SELECT CASE WHEN (<column_value> <= <value>) THEN WHEN (<column_value> <= <value>) THEN ELSE <value> FROM <table_name>; |
SELECT line_number, CASE WHEN (line_number < 10) THEN 'Ones' WHEN (line_number < 100) THEN 'Tens' WHEN (line_number < 1000) THEN 'Hundreds' ELSE 'Thousands' END RESULT_SET FROM airplanes; | |
The above demo turned into a view | CREATE OR REPLACE VIEW line_number_view AS SELECT line_number, CASE WHEN (line_number < 10) THEN 'Ones' WHEN (line_number < 100) THEN 'Tens' WHEN (line_number < 1000) THEN 'Hundreds' ELSE 'Thousands' END RESULT_SET FROM airplanes; |
CASE - DECODE Comparison | |
The same functionality written using both functions | SELECT parameter, DECODE(SIGN(parameter-1000),-1,'C','P') AS BAND FROM parameter_table; SELECT parameter, CASE WHEN parameter < 1000 THEN 'C' ELSE 'P' END AS BAND FROM parameter_table; |
1、java数据库操作基本流E?
2、几个常用的重要技巧:
可滚动、更新的记录?
扚w更新
事务处理
java数据库操作基本流E:取得数据库连?- 执行sql语句 - 处理执行l果 - 释放数据库连?
1、取得数据库q接
1Q用DriverManager取数据库q接
例子Q?
String className,url,uid,pwd;
className = "oracle.jdbc.driver.OracleDriver";
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr;
uid = "system";
pwd = "manager";
Class.forName(className);
Connection cn = DriverManager.getConnection(url,uid,pwd);
2Q用jndi(java的命名和目录服务)方式
例子
String jndi = "jdbc/db";
Context ctx = (Context) new InitialContext().lookup("java:comp/env");
DataSource ds = (DataSource) ctx.lookup(jndi);
Connection cn = ds.getConnection();
多用于jsp?
2、执行sql语句
1Q用Statement来执行sql语句
String sql;
Statement sm = cn.createStatement();
sm.executeQuery(sql); // 执行数据查询语句QselectQ?
sm.executeUpdate(sql); // 执行数据更新语句Qdelete、update、insert、drop{)statement.close();
2Q用PreparedStatement来执行sql语句
String sql;
sql = "insert into user (id,name) values (?,?)";
PreparedStatement ps = cn.prepareStatement(sql);
ps.setInt(1,xxx);
ps.setString(2,xxx);
...
ResultSet rs = ps.executeQuery(); // 查询
int c = ps.executeUpdate(); // 更新
3、处理执行结?
查询语句Q返回记录集ResultSet?
更新语句Q返回数字,表示该更新媄响的记录数?
ResultSet的方法:
1、next()Q将游标往后移动一行,如果成功q回trueQ否则返回false?
2、getInt("id")或getSting("name")Q返回当前游标下某个字段的倹{?
3、释放连接?
cn.close();
一般,先关闭ResultSetQ然后关闭StatementQ或者PreparedStatementQ;最后关闭Connection
可滚动、更新的记录?
1、创建可滚动、更新的Statement
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);
该Statement取得的ResultSet是可滚动的
2、创建PreparedStatement时指定参?
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet.absolute(9000);
扚w更新
1、Statement
Statement sm = cn.createStatement();
sm.addBatch(sql1);
sm.addBatch(sql2);
...
sm.executeBatch()
一个Statement对象Q可以执行多个sql语句以后Q批量更新。这多个语句可以是delete、update、insert{或兼有
2、PreparedStatement
PreparedStatement ps = cn.preparedStatement(sql);
{
ps.setXXX(1,xxx);
...
ps.addBatch();
}
ps.executeBatch();
一个PreparedStatementQ可以把一个sql语句Q变换参数多ơ执行,一ơ更新?
事务的处?
1、关闭Connection的自动提?
cn.setAutoCommit(false);
2、执行一pdsql语句
要点Q执行每一个新的sql语句前,上一ơ执行sql语句的StatementQ或者PreparedStatemetQ必dclose
Statement sm ;
sm = cn.createStatement(insert into user...);
sm.executeUpdate();
sm.close();
sm = cn.createStatement("insert into corp...);
sm.executeUpdate();
sm.close();
3、提?
cn.commit();
4、如果发生异常,那么回滚
cn.rollback();
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
字符函数Q?BR>initcap(st) q回st每个单词的首字母大写,所有其他字母小?BR>lower(st) q回st每个单词的字母全部写
upper(st) q回st每个单词的字母全部大写
concat(st1,st2) q回st为st2接st1的末(可用操作W?||"Q?BR>lpad(st1,n[,st2]) q回叛_齐的st,st为在st1的左边用st2填充直至长度为n,st2的缺省ؓI格
rpad(st1,n[,st2]) q回左对齐的st,st为在st1的右边用st2填充直至长度为n,st2的缺省ؓI格
ltrim(st[,set]) q回st,stZ左边删除set中字W直到第一个不是set中的字符。缺省时Q指的是I格
rtrim(st[,set]) q回st,stZ双删除set中字W直到第一个不是set中的字符。缺省时Q指的是I格
replace(st,search_st[,replace_st]) 每ơ在st中出现的search_st用replace_st替换Q返回一个st。缺省时Q删除search_st
substr(st,m[,n]) n=q回st串的子串Q从m位置开始,取n个字W长。缺省时Q一直返回到st末端
length(st) 数|q回st中的字符?BR>instr(st1,st2[,m[,n]]) 数|q回st1从第m字符开始,st2Wnơ出现的位置Qm及n的缺省gؓ1
例:
1.
select initcap('THOMAS'),initcap('thomas') from test;
initca initca
------ ------
Thomas Thomas
2.
select concat('abc','def') "first" from test;
first
-----
abcdef
3.
select 'abc'||' '||'def' "first" from test;
first
-----
abc def
4.
select lpad(name,10),rpad(name,5,'*') from test;
lpad(name,10) rpad(name,5,'*')
------------ ----------------
mmx mmx**
abcdef abcde
5.
L地址字段末端的点及单词st和rd
select rtrim(address,'. st rd') from test
6.
select name,replace(name,'a','*') from test;
name replace(name,'a','*')
---- ---------------------
great gre*t
7.
select substr('archibald bearisol',6,9) a,substr('archibald bearisol',11) b from test;
a b
------- -------
bald bear bearisol
8.
select name,instr(name,' ') a,instr(name,' ',1,2) b from test;
name a b
------- -------- ---------
li lei 3 0
l i l 2 4
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
转换函数Q?BR>nvl(m,n) 如果mgؓnull,q回n,否则q回m
to_char(m[,fmt]) m从一个数D{换ؓ指定格式的字W串fmt~省Ӟfmt值的宽度正好能容Ux有的有效数字
to_number(st[,fmt]) st从字W型数据转换成按指定格式的数|~省时数值格式串的大正好ؓ整个?BR>附:
to_char()函数的格式:
---------------------------------
W号 说明
---------------------------------
9 每个9代表l果中的一位数?BR>0 代表要显C的先导0
$ 元W号打印在数的左?BR>L L的当地货币符?BR>. 打印十进制的数?BR>, 打印代表千分位的逗号
---------------------------------
例:
1.
select to_number('123.45')+to_number('234.56') form test;
to_number('123.45')+to_number('234.56')
----------------------------------------
358.01
2.
select to_char(987654321) from test;
to_char(987654321)
------------------
987654321
3.
select to_char(123,'$9,999,999') a,to_char(54321,'$9,999,999') b,to_char(9874321,'$9,999,999') c from test;
a b c
------- ---------- -----------
$123 $54,321 $9,874,321
4.
select to_char(1234.1234,'999,999.999') a,to_char(0.4567,'999,999.999') b,to_char(1.1,'999,999.999') from test;
a b c
--------- ---------- ------------
1,234.123 .457 1.100
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
分组函数Q?BR>avg([distinct/all] n) 列n的^均?BR>count([all] *) q回查询范围内的行数包括重复值和I?BR>count([distinct/all] n) 非空值的行数
max([distinct/all] n) 该列或表辑ּ的最大?BR>min([distinct/all] n) 该列或表辑ּ的最?BR>stdev([distinct/all] n) 该列或表辑ּ的标准偏差,忽略I?BR>sum([distinct/all] n) 该列或表辑ּ的d
variance([distinct/all] n) 该列或表辑ּ的方差,忽略I?/FONT>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
日期函数Q?BR>add_months(d,n) 日期d加n个月
last_day(d) 包含d的月份的最后一天的日期
month_between(d,e) 日期d与e之间的月份数Qe先于d
new_time(d,a,b) a时区的日期和旉d在b时区的日期和旉
next_day(d,day) 比日期d晚,由day指定的周几的日期
sysdate 当前的系l日期和旉
greatest(d1,d2,...dn) l出的日期列表中最后的日期
least(d1,k2,...dn) l出的日期列表中最早的日期
to_char(d [,fmt]) 日期d按fmt指定的格式{变成字符?BR>to_date(st [,fmt]) 字符串st按fmt指定的格式{成日期|若fmt忽略Qst要用~省格式
round(d [,fmt]) 日期d按fmt指定格式舍入到最q的日期
trunc(d [,fmt]) 日期d按fmt指定格式截断到最q的日期
附:
日期格式Q?BR>Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-
格式代码 说明 举例或可取值的范围
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-
DD 该月某一?nbsp; 1Q?
DY 三个大写字母表示的周?nbsp;SUNQ?..SAT
DAY 完整的周几,大写英文 SUNDAYQ?..SATURDAY
MM 月䆾 1Q?2
MON 三个大写字母表示的月?nbsp;JANQ?..DEC
MONTH 完整 JANUARY,...DECEMBER
RM 月䆾的罗马数?nbsp; I,...XII
YY或YYYY 两位Q四位数字年
HH:MI:SS Ӟ分:U?BR>HH12或HH24 ?2时?4时昄
MI ?BR>SS U?BR>AM或PM 上下午指C符
SP 后缀SP要求拼写ZQ何数值字D?BR>TH 后缀TH表示d的数字是序数 4th,1st
FM 前缀Ҏ(gu)或日或年|止填充
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?BR>例:
1.
下一个周五的日期
select next_day(sysdate,6) from test;
2.
两个月前的今天的日期
select add_months(sysdate,-2) from test;
? 左v Ed Oates、Bruce Scott、Bob Miner、Larry Ellison
? 国 Oracle 公司总部一?/FONT>
? Bruce Scott 现在是PointBase公司的创办者之一
? 桀骜不驯的Larry Ellison
?/SPAN>1Q?/SPAN>Oracle8高复制环境初始化参数设|?/SPAN> | ||
参数名称 |
推荐?/FONT> |
备注 |
processes |
100 |
|
shared_pool_size |
30000000 |
臛_30MQ如果有很多的复制对象的话,则需要更多的I间 |
large_pool_size |
500K |
|
db_block_buffers |
550 |
|
compatible |
8.0.5.0 |
|
db_file_multiblock_read_count |
16 |
|
dml_locks |
100 |
|
sequence_cache_entries |
30 |
|
sequence_cache_hash_buckets |
23 |
|
global_names |
TRUE |
|
distributed_lock_timeout |
300 |
|
distributed_transactions |
10 |
|
Open_links |
6 |
复制节点多的话,需要增?/FONT> |
Sort_area_size |
1000000 |
|
db_name |
ORA_BJ |
或?SPAN lang=EN-US>ORA_NB |
job_queue_processes |
6 |
|
job_queue_interval |
60 |
|
parallel_max_servers |
10 |
只适用于ƈ行传?/FONT> |
parallel_min_servers |
2 |
只适用于ƈ行传?/FONT> |
PEPLICATION_DEPENDENCY_TRACKING |
true |
如果采用q行传播Q必设|ؓTRUE |
?/SPAN>1中各个参数的推荐D为目前的复制环境只有两个节点Q一个简单的高复制环境Q如果节点较多,且复制关pd杂,需要复制的表也很多Q则需要相应增大一些参数的|q可以通过修改不同的参数试验获得?/SPAN>
所有的SNAPSHOT_ 或者是JOB_QUEUE_KEEP_CONNECTIONS参数都删除,因ؓoracle8以后已经不支持这些参数?/SPAN>
2.Net8参数文g
(1)sqlnet.ora文g讄 |
automatic_ipc=off |
(2)tnsnames.ora文g讄 |
ORA_BJ.world = |
上面Host为各个复制节点的IP地址Q如果复制节点很多,则全部加入到tnsnames.ora文g中,本例中有两个节点?/SPAN>
3.表空?/SPAN>
如果搭徏Oracle 8高的高U复制环境,额外需要加大一些表I间Q表2是徏议的初始表空间?/SPAN>
?/SPAN>2Q?/SPAN>Oraclepȝ表空间大设|?/SPAN> | |
表空?/FONT> |
初始?/FONT> |
SYSTEM |
臛_20M |
ROLLBACK SEGMENTS |
臛_20M |
TEMPORARY |
臛_10M |
TOOLS |
臛_20M |
同时Q我q徏议回滚段的下一个区大小讄臛_?/SPAN>100K?/SPAN>
上面q些的设|是一U较?yu)复制环境下的空间设|。如果要复制的表很多Q每天的变化量很大,复制节点复杂Q则需要相应增大表I间的大?/SPAN>
3>update A
set A3 = (select A.A3 + B.B3 from B where A.A1 = B.B1) ;
7>update (select a1,a3,b1,b3 from a,b where a1=b1) set a3=a3+b3
开执行计划, 谈论效率是没有太多的意义的^_^..
三楼的写法与7楼的写法得到的结果是不同? 三楼的写法会更新所有记? ?楼的写法只修改两者相交的相关记录信息. 7楼的写法可以更加Ҏ(gu)的控制这条update语句的执行计? 不过要求B表必d对应的字D上有主键烦?) , 在B表在对应字段上有主键索引的时? 使用7楼的写法. 可以参考一下这个帖子^_^ http://www.cnoug.org/viewthread.php?tid=44070 (试没有成功..不知道怎么搞的.)
参考了下面?
非常佩服。抱着学习的态度Q重写了一下三楼的Q在没有主键的情况,h教:
update a set a3=(select a3+b3 from b where a1=b1) where a1=(select b1 from b where a1=b1) 如下:
update con_eme_on20050309 a set a.con_price=(select a.con_price+(b.annuity-a.annuity)+(b.nojob-a.nojob)
+(b.medicare-a.medicare)+(b.birthfee-a.birthfee)+(b.bruisefee-a.bruisefee) from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base), a.emp_base=(select b.emp_base from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base), a.annuity=(select b.annuity from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base), a.nojob=(select b.nojob from con_eme_on200404 bwhere a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base), a.medicare=(select b.medicare from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base), a.birthfee=(select b.birthfee from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base), a.bruisefee=(select b.bruisefee from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base), a.nojobbase=(select b.nojobbase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base), a.mediabase=(select b.mediabase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base), a.birthbase=(select b.birthbase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base), a.bruisebase=(select b.bruisebase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base)where a.emp_cod in(select b.emp_cod from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base) 公积?
update con_eme_on20050309 a set a.con_price=(select a.con_price+(b.accumulation-a.accumulation) from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),a.accumulation=(select b.accumulation from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base), a.accumulationbase=(select b.accumulationbase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),a.accumulationbase1=(select b.accumulationbase1 from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base) where a.emp_cod in(select b.emp_cod from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base) ![]() |