RickTroy

Richard Troy-Rex's Microsoft .NET Technology Blog 博客内所有文章和随笔均为个人言论,本着交流、共享的宗旨,允许转载,但请在转载的时候注明出处。如果对文章、随笔的内容有任何指正和异议,请电子邮件联系ricktroy@126.com。

导航

无中间表数据的表连接

作者:Ricktroy (ricktroy@126.com, http://ricktroy.cnblogs.com/ )

问题:表A为部门表,表B为员工表,数据库中存在表C为部门-员工对应关系表(为了阐述问题所以使用部门、员工两种数据实体,实际在设计的情况下可以把这个关系设计在员工表中。项目中遇到的是两种关系特殊,即业务逻辑连接比较脆弱的两个数据实例,这里只是拿部门、员工两种数据实例来举个例子)。
         因为是Web应用程序,表C的数据早已经从数据库中取出放在了会话变量中,在经过了长时间的业务操作后,要通过存储在会话变量中的表C中的一条数据检索出表A的一条数据和表B的0~n条数据的组合,要求表B数据为0条的时候,检出数据一条为表B的一条数据。

以上就是我昨天所遇到的一个业务问题,为了减少数据库访问,虽然是两个逻辑关系十分脆弱(脆弱的原因是联系两张表数据的数据不在数据库中,而是在应用程序侧),最后的解决方案是,用会话变量中的数据作为限定条件(Where子句),检出的两张子表用左外连接。左外连接的使用根据问题的最后一条就可以想到,但是两张表却没有明确的连接关系,实际上因为会话变量作为检索条件的原因,两张表检出的数据一定是符合业务要求的,那么我们需要做的就是进行“硬性连接”方法如下:

Select A.*,B.* From (Select *, 1 as Conn From Table1 Where Table1.Var1=[SessionVariable1]) A Left Outer Join
(Select *, 1 as Conn From Table2 Where Table2.Var2=[SessionVariable2]) B On A.Conn = B.Conn
OrderBy A.SortOrd1 ASC,B.SortOrder DESC

黑体的内容就是“硬性连接“的方法。SessionVariable1、SessionVariable2 是联系两张表的会话变量。最后排序的时候要注意OrderBy不能出现于子查询中要写在最外面。

posted on 2007-01-09 07:56  RickTroy  阅读(2342)  评论(8编辑  收藏  举报