现在要实现的是列出一个单位所有用户列表
如果没有排序功能的话只需要TbDeptUser一个表就可以了
(SELECT * FROM TbDeptUser WHERE DeptId=?)
可是现在需要根据TbPosition表的OrdinalNum字段排序
需要用到三个表:
TbDeptUser 单位用户配置表 需要的子段:UserId , DeptId
TbUser 用户表 需要的子段:UserId , PositionId
TbPosition 职位表 需要的子段:PositionId , DeptId , OrdinalNum
TbDeptUser 单位用户配置表
DeptId可重复,因为一个单位有多个用户。
TbUser 用户表
用户与职位一一对应。一个用户也可能没有职位,这时候PositionId值为-1
TbPosition 职位表
DeptId可重复,因为一个单位有多个职位,OrdinalNum按DeptId分组。
这个问题在前面问过了,但是我忽略了一个很重要的问题
下面的SQL查询是没有考虑用户不存在职位的情况,其结果的排序是对的,但是缺少没有职位的用户纪录
SELECT pd.UserId
FROM TbDeptUser pd,( SELECT u.UserId
FROM TbUser u, TbPosition p
WHERE u.PositionId=p.PositionId
ORDER BY p.OrdinalNum ASC) pt
WHERE pd.UserId=pt.UserId
AND pd.DeptId=?
下面的SQL查询是考虑了用户不存在职位的情况,其结果的排序是错的,但是结果集个数是对的
SELECT DISTINCT pd.UserId
FROM TbDeptUser pd,( SELECT u.UserId
FROM TbUser u, TbPosition p
WHERE u.PositionId=p.PositionId
OR u.PositionId<0
ORDER BY p.OrdinalNum ASC) pt
WHERE pd.UserId=pt.UserId
AND pd.DeptId=?
SELECT DISTINCT pd.UserId
FROM TbDeptUser pd,( SELECT u.UserId
FROM TbUser u, TbPosition p
WHERE u.PositionId=p.PositionId
OR u.PositionId=0
ORDER BY p.OrdinalNum ASC) pt
WHERE pd.UserId=pt.UserId
AND pd.DeptId=?
???
数据库里PositionId针对没有职位的人设一个数值不就行了?比如-1,这样就容易排序了,不用在WHERE时用OR判断了
SELECT DISTINCT pd.UserId
FROM TbDeptUser pd,(
(SELECT u.UserId
FROM TbUser u, TbPosition p
WHERE u.PositionId=p.PositionId
ORDER BY p.OrdinalNum ASC)
union
(SELECT u.UserId
FROM TbUser u, TbPosition p
WHERE u.PositionId<0)
) pt
WHERE pd.UserId=pt.UserId
AND pd.DeptId=?
不知道可以不?不过效率可能降低了
你为什么不把排序拿到外面来做呢?看看这样行不行,错了不好意思啊,我也没时间细看:)
SELECT DISTINCT pd.UserId
FROM TbDeptUser pd,( SELECT u.UserId,p.OrdinalNum
FROM TbUser u, TbPosition p
WHERE u.PositionId=p.PositionId
OR u.PositionId<0) pt
WHERE pd.UserId=pt.UserId
AND pd.DeptId=?
ORDER BY pt.OrdinalNum
up
DRYDGDFG
up
select Distinct pd.UserID from TbDeptUser pd
INNER join TbUSer u on pd.UserId=u.UserId
INNER join TbPosition p on u.PositionId=p.PositionId
where u.PositionId<0
ORDER BY p.OrdinalNum ASC
up