最近把原来开发的一个小项目重新找出来,改为分层数据访问结构,并且优化了 数据库 设计,去除了很多冗余的表,采用比较高效的控制结构,但在今天就遇到了问题: 现有表: g(gid, abid,aid, bid) a(aid, aname) b(bid, bname) s(sid, sname) ab(abid, sid, c
最近把原来开发的一个小项目重新找出来,改为分层数据访问结构,并且优化了数据库设计,去除了很多冗余的表,采用比较高效的控制结构,但在今天就遇到了问题:
现有表:
g(gid, abid, aid, bid)
a(aid, aname)
b(bid, bname)
s(sid, sname)
ab(abid, sid, content)
其中表s是用来存储类别的,现在想通过数据库查询返回如下结果
aname bname s1name s2name ...... snname(s表中的类别,内容为对应的content值)
原先老系统的做法是对于s中的类型建立n张表存储,但是这样不便于扩展,现在为了适应s类别动态增加的要求,就改为数据库存储类别的方式,但是这样的做法带来了问题,首先就是如何将一个表(ab)中的不同sid的数据划分为单独的列,并且在一次查询中取出显示在一个视图当中。
仔细想了一下只能使用查询连接(join)的方法,必须构造如下的语句:
select g.gid, a.aname as aname , b.bname as bname ---固定语句1
, ab1.content as s1name , ab2.content as s2name , ab3.content as s3name ---构造语句1
from ---固定语句2
(((((g g left join a a on g.aid = a.aid) ---构造语句2
left join b b on (g.bid = b.bid)) ---固定语句3
left join ab ab1 on (g.abid = ab1.abid and ab1.sid = s1)) ---构造语句3
left join ab ab2 on (g.abid = ab2.abid and ab2.sid = s2)) ---构造语句4
left join ab ab3 on (g.abid = ab3.abid and ab3.sid = s3)) ---构造语句5
where 其他限制条件 ---其他语句
此语句用到了多表的left join连接;
想要达到检索目标就必须通过程序构造如以上的sql语句,本人的心得如下,将以上sql语句分段固定语句1-3以及其他语句可以先行写好;
构造语句
1.利用循环将s表中的所有类别(包括sid及sname)查询出来放入dataset中,并将查询结果数目作为循环次数值
2.每次循环构造
“构造语句1” --- 按照格式将查询出的数据从dataset中取出填上
“构造语句2” --- 在((g g left join a a on g.aid = a.aid)基础上每次在前添加(
构造语句3-5 --- 根据格式填写,数量即为循环次数
最后按照顺序将所有语句连接起来即可构成所求sql语句
本文主要采用例子的形式介绍了根据数据库记录动态进行查询连接的方法,应用时可以根据需要进行调整,不过应该注意以下几点:
1.分段语句的两头最好留下空格,即: + substring + 以免最后构成sql语句时出现错误
2.access采用j-sql在多表查询连接时必须注意括号的用法,这就是构造语句2生成的原理,括号必须一层嵌套一层,可以在连接好的sql语句中看出层次关系。