您的位置:程序门 -> ms-sql server -> 基础类



求助:一个简单的sql查询,我怎么就想不出来呢?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


求助:一个简单的sql查询,我怎么就想不出来呢?
发表于:2007-06-29 10:54:04 楼主
用户表user,froleid是外键和角色表关联,即一个用户可以有多个角色
fuserid           froleid
-----------   -----------
1                       1
1                       2
1                       3
2                       1
2                       2
3                       3
4                       3

角色表
froleid           fname
-----------   --------------------
1                       系统管理员
2                       vip用户
3                       用户

现在的问题是,如何得到roleid不是1的用户

结果应该是:
fuserid           froleid
-----------   -----------
3                       3
4                       3

现在我的实现是:
declare   @user   table(fuserid   int,   froleid   int)
insert   @user   values(1,1)
insert   @user   values(1,2)
insert   @user   values(1,3)
insert   @user   values(2,1)
insert   @user   values(2,2)
insert   @user   values(3,3)
insert   @user   values(4,3)

declare   @role   table(   froleid   int,fname   varchar(20))
insert   @role   values(1, '系统管理员 ')
insert   @role   values(2, 'vip用户 ')
insert   @role   values(3, '用户 ')
select   *   from     @user   where   fuserid   not   in(   select   fuserid   from   @user   a   inner   join   @role   b   on     a.froleid=b.froleid   where   b.froleid=1)

但是我觉得这样的做法有点笨啊,多嵌入了一层子查询,能不能不嵌入子查询?
请大家帮我改改……

发表于:2007-06-29 10:58:211楼 得分:0
select   *   from   user   a   where   a.fuserid       not   in   (select   b.fuserid     from   user   b   where   b.roleid   =   1)
发表于:2007-06-29 10:58:362楼 得分:0

declare   @user   table(fuserid   int,   froleid   int)
insert   @user   values(1,1)
insert   @user   values(1,2)
insert   @user   values(1,3)
insert   @user   values(2,1)
insert   @user   values(2,2)
insert   @user   values(3,3)
insert   @user   values(4,3)

declare   @role   table(   froleid   int,fname   varchar(20))
insert   @role   values(1, '系统管理员 ')
insert   @role   values(2, 'vip用户 ')
insert   @role   values(3, '用户 ')

select   *   from     @user   a
where     not   exists   (
select   1   from   @user
where   fuserid=a.fuserid
and   froleid=1
)

--结果
fuserid           froleid          
-----------   -----------  
3                       3
4                       3

(所影响的行数为   2   行)

发表于:2007-06-29 10:59:133楼 得分:0
角色表可以不用
发表于:2007-06-29 11:02:004楼 得分:0
declare   @user   table(fuserid   int,   froleid   int)
insert   @user   values(1,1)
insert   @user   values(1,2)
insert   @user   values(1,3)
insert   @user   values(2,1)
insert   @user   values(2,2)
insert   @user   values(3,3)
insert   @user   values(4,3)

declare   @role   table(   froleid   int,fname   varchar(20))
insert   @role   values(1, '系统管理员 ')
insert   @role   values(2, 'vip用户 ')
insert   @role   values(3, '用户 ')


select   *   from   @user   a
where   not   exists(select   1   from   @user   where   fuserid   =   a.fuserid   and   froleid   =   1)
发表于:2007-06-29 11:08:595楼 得分:0
select   a.*   from   @user   a
left   join
(select   *   from   @user
where   froleid=1)b
on   b.fuserid=a.fuserid
where   b.fuserid   is   null
发表于:2007-06-29 11:13:376楼 得分:0
to   coolingpipe(冷箫轻笛),coolingpipe(冷箫轻笛)  
如果froleid   不为1或2呢
发表于:2007-06-29 11:17:577楼 得分:0
select   *   from   @user   a
where   not   exists(select   1   from   @user   where   fuserid   =   a.fuserid   and   (froleid   in(1,2))
发表于:2007-06-29 11:23:088楼 得分:0
create   table   haolaiwu_user

    fuserid   int,
    froleid   int
)
insert   into   haolaiwu_user
select   1           ,             1   union   all
select   1           ,             2   union   all
select   1           ,             3   union   all
select   2           ,             1   union   all
select   2           ,             2   union   all
select   3           ,             3   union   all
select   4           ,             3  


create   table   haolaiwu_roleid

    froleid   int,
    fname   varchar(10)
)
insert   into   haolaiwu_roleid
select   1           ,           '系统管理员 '   union   all
select   2           ,           'vip用户 '               union   all
select   3           ,           '用户 '  


select   *   from   haolaiwu_user
select   *   from   haolaiwu_roleid

select   *   from     haolaiwu_user   t
where     not   exists   (
select   *   from   haolaiwu_user
where   fuserid=t.fuserid
and   froleid=1
)

fuserid           froleid          
-----------   -----------  
3                       3
4                       3
发表于:2007-06-29 11:28:129楼 得分:0
多谢各位了
哈哈


快速检索

最新资讯
热门点击