使用INTERSECT来提高关联查询的效率

有三个表分别为et_task_termtt, et_core_thes_term_category ttc , et_core_thes_terms t 其中tt.termid=t.id、ttc.termid=t.id 刚 开始时用自然连接,sql语句为:select t.name from et_task_term tt,et_core_thes_term_category ttc , et_core_thes_terms t where tt.termid=ttc.termid and tt.taskid=50487 and ttc.inschemeid=14653 and ttc.categoryno='56GA' and tt.termid=t.id   运行时间为:3781ms

效率太低下,不能采用这种方式。

然后改为左外连接,sql为:select t.* from et_core_thes_terms t left outer join et_core_thes_term_category ttc on t.id =ttc.termid left outer join et_task_term tt on t.id =tt.termId where ttc.categoryno='56GA'  and tt.taskid=504875  运行时间为:2985ms。虽然比自然连接效率高些,但是还是低下。

最后经过查询数据库手册想到了组合查询,组合查询包括并,交,差,语法为:

query1 UNION [ALL] query2

query1 INTERSECT [ALL] query2

query1 EXCEPT [ALL] query2

query1 和 query2 都是可以使用我们到此为止讨论的所有查询特性的查询。集合操作也可以嵌套和级连,比如

query1 UNION query2 UNION query3

实际上说的是

(query1 UNION query2) UNION query3

 

UNION 有效地把 query2 的结果附加到 query1 的结果上(不过我们不能保证这就是这些行实际返回的顺序)并且删除结果中所有重复的行,就象DISTINCT做的那样,除非你声明了UNION ALL。

INTERSECT 返回那些同时存在于 query1 的结果中和 query2的结果中的行,除非声明了INTERSECT ALL,否则所有重复行都被删除。

EXCEPT 返回所有在 query1 的结果中但是不在 query2 的结果中的行。 (有时侯这叫做两个查询的差。)除非声明了 EXCEPT ALL,否则所有重复行都被删除。

为了计算两个查询的并,交,差,这两个查询必须是"并集兼容的",也就意味着它们都返回同样数量的列,并且对应的列有兼容的数据类型。

最后的sql语句为:

select ect.id,ect.name from ( select ttc.termid from et_core_thes_term_category ttc where ttc.categoryno='56GA' and ttc.inschemeid=14653
INTERSECT   select t.id from et_core_thes_terms t where t.thesid=14652
 
INTERSECT  select tt.termid from et_task_term tt where tt.taskid=504875 ) a,et_core_thes_terms ect  where a.termid=ect.id 

 运行时间为:203ms效率较前两种情况明显的提高了。

 

你可能感兴趣的:(05_SQL)