wguser(userid,loginame) ,wggroup (GROUPID,GROUPNAME) ,wgusergroup(USERID,GROUPID)
想创建一个视图显示如下形式:
条件是:如果userid,wggroup分别在wgusergroup中的话就显示wggroup。GROUPNAME,如果都不在就显示' 未分组'
userid, loginame, GROUPID, GROUPNAME
1 dbf 20090811205831390638 测试用户组
20090804123700421 john 未分组 未分组
想创建一个视图显示如下形式:
条件是:如果userid,wggroup分别在wgusergroup中的话就显示wggroup。GROUPNAME,如果都不在就显示' 未分组'
userid, loginame, GROUPID, GROUPNAME
1 dbf 20090811205831390638 测试用户组
20090804123700421 john 未分组 未分组
解决方案 »
- 求个SQL,写不出...
- group by的初级问题,迷惑中,求解
- 急!Oracle CHINESE_CHINA.US7ASCII 乱码问题
- PowerDesigner 中如何将同义词授权给PUBLIC
- 安装ORACLE 时进行先决条件检查提示path长度不够
- 急!!!小弟现自学oracle,遇到登陆权限问题!往高手解决!!
- 一个数据库之间的转换问题!急!
- 一个让我疑惑的SQL性能问题,还请高手指点
- 在存储过程中,通过链路从另一个数据库中取一个大表到本数据库,……………(100)
- 我真的有点倒霉,请高手指教,在线等候。
- 数据库开发工程师如何写好详细设计说明书啊?
- oracle数据库没有的用户也能登陆?
select t1.userid
, t1.loginname
, decode(t2.groupid,null,'未分组',t2.groupid) groupid
, decode(t2.groupname,null, '未分组','测试用户组') groupname
from wguser t1
, wggroup t2
, wgusergroup t3
where t3.groupid = t2.groupid
and t1.userid = t3.userid(+);
create view viewname as
select t1.userid
, t1.loginname
, decode(t3.groupid,null,'未分组',t2.groupid) groupid
, decode(t3.groupid,null, '未分组','测试用户组') groupname
from wguser t1
, wgusergroup t3
where t1.userid = t3.userid(+);
但对应的groupid却不在wggroup的情况,这种情况表示在用户组织关系表中,该用户属于某个组,但这个组却是在组织信息表里没有的,是虚构的,这种情况一般是数据问题了。
参考以下代码,看是否满足你的需求
select
a.user_id -- 用户编码
,a.loginname -- 用户名
,case when b.user_id is not null and c.group_id is not null then b.group_id
else '未分组' -- 所属分组
end
,case when b.user_id is not null and c.group_id is not null then c.group_name
else '未分组' -- 分组名称
end
from wguser a
left join wgusergroup b
on a.user_id = b.user_id
left join wggroup c
on b.group_id = c.group_id
;
改了一下shiyiwan 的,左外连接用的对,还是得用wggroup表,得显示组名
修正一下条件,可能有的不明白意思,抱歉啊!
/*
条件:若userid,groupid分别在wgusergroup中则显示wggroup.userid,wggroup.GROUPNAME,如果都不在就显示'未分组',且对应的userid和groupid在视图中之显示一条记录。
*/
上面各位写的都没对USERID进行DISTINCT,都怪我之前说的不够清楚!
SQL优化来考虑,比较一下以上写的哪个更好,说出理由啦!(wguser是基本表,数据量相对另外两张比较多一些,其他2张数据量不是很大,其中Wgroup还有别的字段,wgusergroup 就2个字段!)
下面是我写的,欢迎怕转……
SELECT distinct u.userid id, u.loginname username,DECODE (b.groupid,NULL,'未分组',b.groupid) groupid ,
DECODE(b.groupname, NULL, '未分组',b.groupname) groupname
FROM wguser u
LEFT JOIN
(SELECT userid, ug.groupid, g.groupname
FROM wggroup g, wgusergroup ug
WHERE g.groupid = ug.groupid) b
ON u.userid = b.userid