表一  :(basis_role)
           roleid        rolename
           ------        ---------
            001            system
            002            operater
表二  :(basis_user)
            userid    username     roleid
           --------   --------    --------              
            1001      Bruce_Lee    001,002
现在想得到一条用户1001的记录:
     输出: 用户编号    用户名称     角色
           1001        BruceLee     system,operater      请问用Sql语句怎么实现?

解决方案 »

  1.   

    建议:
    表二  :(basis_user)
                userid    username     roleid
               --------   --------    --------              
                1001      Bruce_Lee    001
                1001      Bruce_Lee    002
    这方便点
      

  2.   

    数据库不好实现,用程序实现嘛,数据库要实现也是个存储过程,其实也就是程序多写几段代码,取出001,002,然后在表一  :(basis_role)中select rolename from basis_role where roleid in (001,002),然后将rolename循环存到一个数组或者字符串里都行        
      

  3.   

    用sql比较麻烦,不过如果放在DataTable中处理会方便的多
      

  4.   

    CREATE  function Getrolename(
    @roleid varchar(50)
    )
    returns varchar(600)
    as
    begin
       declare @r varchar(600)
       declare @index int
       set @index =0
       set @r = (select top 1 rolename from basis_role where roleid = substring(@roleid,@index,CHARINDEX(',', @roleid, @index+1)))+';'
       set @index = CHARINDEX(',', @roleid, @index+1)
       while(CHARINDEX(',', @roleid, @index+1)<>0)
       begin
        set @r = @r + (select top 1 rolename from basis_role where roleid = substring(@roleid,@index+1,CHARINDEX(',', @roleid, @index+1)))+';'
        set @index = CHARINDEX(',', @roleid, @index+1)
       end
    set @r = @r + (select top 1 rolename from basis_role where roleid = substring(@roleid,@index+1,len(@roleid)))
       return @r
    end
    -----------------------------
    SELECT userid, username, dbo.Getrolename(roleid) AS Expr1
    FROM basis_user
      

  5.   

    terry_12(大撒发射点) ( ) 信誉:100  2006-08-17 10:44:00  得分: 0  
    先谢谢你的解答
    那个roleid 从哪来?
    我操作是:只给你一个userid , 你必须得出这个结果
      

  6.   

    roleid 不是在basis_user有么.
      

  7.   

    看错了 我在试!谢谢terry_12
      

  8.   

    可以!谢谢! 还想问一下
    有个函数是我在后台写的:根据menuid得到菜单名 
     GetMenuName(string menuid)  ,不是象你一样在sql里面写的现在有个表   basis_user
            userid username    menuid
            001    Bruce_Lee   1001
    我现在想得到  结果 001 Bruce_Lee 菜单名
    请问怎么做
    strSelect=string.Format("select userid,username,case menuid when menuid then '{0}' end menuid from basis_user",GetMenuName(menuid))
    就是调用函数的时候那个menuid参数怎么得,我这样写是不对的!你晓得!
    帮忙看一下
      

  9.   

    declare @A char(200)
    declare @B char(100)
    select @B=roleid from basis_user where userid ='1001'SET @A= N'select * from basis_role
    where roleid  in (' + @B +')'
    exec (@A)不知道有没有写错还要的应该可以用程序加工加工
      

  10.   

    不是很明白,直接select userid,username, '菜单名' as menuid from basis_user不就行了吗?
      

  11.   

    terry_12(大撒发射点) ( ) 信誉:100 
    那个菜单名在basis_menu表里面
    我讲清楚点:
    表一:  basis_menu 
       menuid  menuname 
       ------  --------
       001      
       001001  菜单一
       001002  菜单二
    表二:  basis_user
        userid  username menuid
       -------  -------- ------
         001    terry_12   001
         002    flyin2006  001001
    现在要得到  如果用 select A.userid A.username B.menuname from basis_user a ,basis_menu b where a.menuid=b.menuid and rollid=001
     得到结果不完善 ,所以我定义了函数GEtMenuName() 想得到结果
       001  terry_12    根菜单
       002  flyin2006   菜单一
      

  12.   

    当然如果把那个GetMenuName函数写到Sql语句是可以实现
    我想用后台那个GetMenuName(string menuid )能不能实现?
      

  13.   

    giftzheng() ( ) 信誉:100 
    你的可以 ,解决了
    帮我看看后面那个问题谢谢
      

  14.   

    select userid,username,(select menuname from basis_menu where menuid = a.menuid ) from basis_user a 
    不知道是不是这个意思.
      

  15.   

    关键是由menuid得到menuname  不符合我的要求
    我对有些进行了修改
    比如 menuid=001  menuname设为程序入口啊等
    就是讲用你那个句子你得到的menuname有时候不符合
    比如 select userid,username,(select menuname from basis_menu where menuid = a.menuid ) from basis_user where username=terry_12 得到menuname是空值!
    根据menuid得到menuname 的一些自定义规则在我的GetMenuName;里面
      

  16.   

    那你有些什么规则呢?
    可以用CASE去做.写成SQL自定义函数也可以的.
      

  17.   

    是不是直接调用不可能实现?
    是的话我就  只有在写个sql函数了
      

  18.   

    我也觉得不可能实现 sql里面能调用后台参数或函数
    要从后台函数中用到sql语句里面参数 肯定是不可能的 
    算了 自己写!
      

  19.   

    建议 再一个表 来存储
    role , op
    我的网站的权限控制就是这么做的 弄个角色定义表然后再价格 角色对应操作的表最后一个视图就搞定
      

  20.   

    CREATE FUNCTION f_join
    (@gid VARCHAR(100))
    RETURNS VARCHAR
    AS
    BEGIN
    DECLARE @s VARCHAR(1000)
    SET @s=''
    SELECT @s=@s + ','+rolename FROM basis_role WHERE CHARINDEX(',' + roleid + ',' ,',' + @gid + ',')>0
    SET @s=SUTFF(@s,1,1,'')
    RETURN @s
    END
    SELECT userid,username,dbo.f_join(roleid) FROM basis_user
      

  21.   

    而且还用 charindex(...) 与 <>0来匹配. 明显有问题的.
      

  22.   

    如果角色表比较简单,建议考虑case when来实现转换