我有两个表:student与stu_organise,其中student存放学生学号及学生相关信息,stu_organise存放学生参加的社团的组织;表结构脚本如下:CREATE TABLE student (NO VARCHAR2(10), NAME VARCHAR2(10));ALTER TABLE student ADD CONSTRAINT pk_student PRIMARY KEY (NO);
CREATE TABLE stu_organise (org_id VARCHAR2(10), no_s VARCHAR2(10), no_e VARCHAR(10));ALTER TABLE stu_organise ADD CONSTRAINT pk_stu_organise PRIMARY KEY (org_id, no_s);
stu_organise中org_id 表示社团ID,no_s、no_e表示参加该社团的起始学号、结束学号
如:社团ID为00001的学号有1, 2, 3, 5, 6,该表存放数据如下:
org_id no_s no_e
00001 1 3
00001 5 6注:不要问我为什么这样组织表结构,我只说一个原因:数据量非常大。在此,我要查询某社团ID的所有学生信息,我用如下语句:SELECT * FROM student a
WHERE
NOT EXISTS
(SELECT 1 FROM stu_organise z
WHERE z.Org_Id = '00001' AND z.No_s <= a.No AND z.No_e >= a.No);
但该语句执行效率低下,explain结果如下:------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 99450 | 3399K| 76 (28)| 00:00:01 |
| 1 | NESTED LOOPS ANTI | | 99450 | 3399K| 76 (28)| 00:00:01 |
| 2 | TABLE ACCESS FULL | STUDENT | 99699 | 1363K| 58 (6)| 00:00:01 |
|* 3 | TABLE ACCESS BY INDEX ROWID| STU_ORGANISE | 1 | 21 | 0 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | PK_STU_ORGANISE | 1 | | 0 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------请问高手们,有没有好的方法,让语句效率高一些?在此不胜感激!
CREATE TABLE stu_organise (org_id VARCHAR2(10), no_s VARCHAR2(10), no_e VARCHAR(10));ALTER TABLE stu_organise ADD CONSTRAINT pk_stu_organise PRIMARY KEY (org_id, no_s);
stu_organise中org_id 表示社团ID,no_s、no_e表示参加该社团的起始学号、结束学号
如:社团ID为00001的学号有1, 2, 3, 5, 6,该表存放数据如下:
org_id no_s no_e
00001 1 3
00001 5 6注:不要问我为什么这样组织表结构,我只说一个原因:数据量非常大。在此,我要查询某社团ID的所有学生信息,我用如下语句:SELECT * FROM student a
WHERE
NOT EXISTS
(SELECT 1 FROM stu_organise z
WHERE z.Org_Id = '00001' AND z.No_s <= a.No AND z.No_e >= a.No);
但该语句执行效率低下,explain结果如下:------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 99450 | 3399K| 76 (28)| 00:00:01 |
| 1 | NESTED LOOPS ANTI | | 99450 | 3399K| 76 (28)| 00:00:01 |
| 2 | TABLE ACCESS FULL | STUDENT | 99699 | 1363K| 58 (6)| 00:00:01 |
|* 3 | TABLE ACCESS BY INDEX ROWID| STU_ORGANISE | 1 | 21 | 0 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | PK_STU_ORGANISE | 1 | | 0 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------请问高手们,有没有好的方法,让语句效率高一些?在此不胜感激!
解决方案 »
- oracle 10g for linux 包的建立
- 求一个sql语句(一条记录查出两条记录或一条记录的问题)
- oracle查询的问题
- 请看看这个sql语句,在一些机器上有效,在另一些无效,希望指教
- 如何获得sql语句所作用的行数?
- 初学oracle,问个问题.高分!
- 有关ORACLE数据库的修复
- DEVELOPER中利用FORM调用REPORT时,传递了参数,这时会弹出参数输入对话框,怎样隐掉它
- oracle在存储过程中建临时表怎么做?在线等待,50分相送,解决马上就给!
- 请问一下大佬们运行存储过程报错无效的数字怎么解决呢?找不见错误
- 很奇怪的问题,关于Oracle Form的
- sqlserver 到 oracle 脚本错误 COMPUTE by
SELECT a.*
FROM student a ,stu_organise z
WHERE z.No_s <= a.No AND z.No_e >= a.No and z.Org_Id = '00001';
http://blog.csdn.net/bw555/archive/2009/05/19/4200670.aspx
SELECT a.*
FROM student a ,stu_organise z
WHERE z.No_s <= a.No AND z.No_e >= a.No and z.Org_Id = '00001'
INTERSECT
SELECT a.*
FROM student a ,stu_organise z
WHERE z.No_s <= a.No AND z.No_e >= a.No and z.Org_Id = '00002'
FROM student a ,stu_organise z
WHERE z.No_s <= a.No AND z.No_e >= a.No and z.Org_Id IN ('00001','00002','00003');