有三个表分别为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。效率较前两种情况明显的提高了。