3、更好的解决办法
在我写sql语句越来越多的时候,我发现在文章(二)中介绍的外连接确是那么的不好用。第二天一个学弟跟我说了另外一种语句,让我顿时豁然开朗起来。这种解法比外连接要好用很多。
with 别名 as (select * from *)
select * from 别名;
其实就相当于建个临时表,语法就是:with tempname as(select ......)select ......
3.1例子
还是我在文章(二)中提到的获取一个系的毕业设计指导教师的答辩安排
WITH A AS (SELECT * FROM SJ_GD_REPLY B WHERE B.ZT = 1 AND B.FOPENGRAGE = SJ_GD_GENERALMETHOD.GETCURRENTGRADUATIONYEAR)SELECT * FROM SJ_GD_TEACHERS C, A WHERE A.FTEACHERID(+) = C.FTEACHERID AND C.FOPENGRADE = SJ_GD_GENERALMETHOD.GETCURRENTGRADUATIONYEAR AND C.ZT = 1;临时表 A 中存放的是对月本毕业年届已经安排的有效的毕设指导教师答辩信息(有限制条件),接着就是将这个表和SJ_GD_TEACHERS表做了右连接。得到的结果是正确的。
1)这种做法,其实就是把一大堆重复用到的SQL语句放在with as 里面去,取一个别名,后面的查询就可以用到它,这样对于大批量的SQL语句起到了一个优化的作用,而且比起先前使用的外连接更加的清楚明了一些,可读性也高一些。当然对于我来说更好理解和使用;
2)当然这是一个临时存储的,一般是在存储过程中使用的。就我目前的使用而言,最大的好处就是做多表的连接,结果集的连接查询,实在是太方便了。
3)我在网上看到有人说 WITH AS 在存储过程中使用,声明了就一定要用,不然会报错。可是我测试了却不是这么回事,声明了没有使用,仍然是正确的。
4)当要创建多个临时表以供使用时,应该这样写
WITH TEMPNAME1 (SELECT .. .),TEMPNAME2 (SELECT .. .. ..)SELECT .. . FROM TEMPNAME1, TEMPNAME2 .. .. ..5)以上所记录的用法,就涉及到视图的使用了,内联视图、标量子查询、WITH子查询
总结:纠结了这么久,最好最好的解决办法就是使用视图,配合外连接,这样理解起来方便,看得人看得也舒服。很多测试,我就不一一记下了。知识都是在慢慢使用的过程中积累起来的。如果一下子去看那么多东西,没有深入到实践中去,到头来我还是会忘记。