wguser(userid,loginame) ,wggroup (GROUPID,GROUPNAME)  ,wgusergroup(USERID,GROUPID)
想创建一个视图显示如下形式:
条件是:如果userid,wggroup分别在wgusergroup中的话就显示wggroup。GROUPNAME,如果都不在就显示' 未分组'
userid,             loginame,     GROUPID,              GROUPNAME
1                      dbf       20090811205831390638    测试用户组
20090804123700421      john        未分组                  未分组

解决方案 »

  1.   

    create view viewname as 
    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(+);
      

  2.   

    修改一下,好像没有用到wggroup表
    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(+);
      

  3.   

      如果都不在则显示不分组,如果都在就显示wggroup,则你会漏掉另一种情况,那就是userid在wgusergroup,
    但对应的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
    ;
      

  4.   


    改了一下shiyiwan 的,左外连接用的对,还是得用wggroup表,得显示组名
      

  5.   

    谢谢各位!!!
    修正一下条件,可能有的不明白意思,抱歉啊!
    /*
    条件:若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