公寓管理系统经验之无敌数据库(交集、并集、差集)


Union 并集 Ninus 差集) Intersect(交集) 这些是ORACLE SQLPLUS语句中。

因为 我们分入住表
人员号 宿舍号 入住时间 搬出时间
宿舍表
宿舍号 容量。。等宿舍基本信息
而入住人数,是靠入住表统计出来的。但是在调试过程中,发现有些宿舍没有统计出来。也就是生成视图:宿舍号 容量 已入住人数。语句如下,select 宿舍表.宿舍号 ,count(人员号) from 入住表,宿舍表 where 入住表.dno(+)=宿舍表.dno and 入住表.搬出时间 is null.但发现不能SELECT出某个宿舍里面的人完全搬出的宿舍.因为虽然在入住表有数据集,但是搬出时间都是not null的。这样刚好跟前面的条件相违背。is null的条件是确保该入住信息是最新的。

最后上GOOGLE了很多SQL语句,也思考了那些没有宿舍究竟应该怎样才能显示出来。得出思路:
首先找出什么宿舍没有空搬出宿舍的宿舍信息,而统计不出来。
(select dno from pd where pd.pdmove is not null) Minus (select dno from pd where pd.pdmove is null)。填写了搬出时间的入住信息减去搬出时间没有填写的入住信息。
然后加上搬出时间IS NULL的宿舍
(SELECT DORM.DCAP,DORM.DNO,DORM.DPHONE,DORM.DSEX,DORM.DSTYLE,DORM.DR,DORM.dormmoney,
0 as stat,DORM.DCAP as dcdo
FROM DORM,PD WHERE pd.dno in ((select dno from pd where pd.pdmove is not null group by dno) Minus (select dno from pd where pd.pdmove is null group by dno))
and dorm.dno=pd.dno
GROUP BY DORM.DNO,DORM.DCAP,DORM.DPHONE, DORM.DSEX,DORM.DSTYLE,DORM.DR,DORM.dormmoney)
Union (SELECT DORM.DCAP,DORM.DNO,DORM.DPHONE,DORM.DSEX,DORM.DSTYLE,
DORM.DR,DORM.dormmoney,
count(PD.dno) as stat,DORM.DCAP-count(PD.dno) as dcdo
FROM DORM,PD WHERE DORM.DNO=PD.DNO(+) and pd.pdmove is null GROUP BY DORM.DNO,DORM.DCAP,DORM.DPHONE,
DORM.DSEX,DORM.DSTYLE,DORM.DR,DORM.dormmoney)

但是觉得这样颇为复杂。应该有简单的方法吧~~~THINKING
posted @ 2006-11-30 08:30  天天爱晴天  阅读(587)  评论(0)    收藏  举报