actiongroup:id          action            groupid
----------- ----------------- -----------------
1           anzhuangluntan    1
2           guanlibanzhu      1
3           guanlitiezi       1
4           guanlibanzhu      2
5           guanlitiezi       2
6           guanlitiezi       3action:id          actionname        action                                             
----------- ----------------- -----------------
1           安装论坛             anchuangluntan                                     
2           管理版主             guanlibanzhu                                       
3           管理帖子             guanlitiezi              现在又两张表:actiongroup,action
需求:根据actiongroup表中的groupid获取action表中的actionname比如groupid=1时输出管理论坛,管理版主,管理帖子
groupid=2时输出管理版主,管理帖子
groupid=3时输出管理帖子                          

解决方案 »

  1.   

    select *,
    case when groupid = 1 then '管理论坛,管理版主,管理帖子'
         when groupid = 2 then '管理版主,管理帖子'
         else '管理帖子' end
    from actiongroup: 
      

  2.   

    -->生成测试数据
    if object_id('[action]') is not null 
      drop table [action]
    go
    create table [action](id   int, actionname varchar(20), [action] varchar(20))                            
    ----------- ----------------- ----------------- 
    insert [action] select 1  ,        '安装论坛',            'anchuangluntan'                                    
    insert [action] select 2  ,        '管理版主',            'guanlibanzhu'                                      
    insert [action] select 3  ,        '管理帖子',            'guanlitiezi'
    go
    if object_id('actiongroup') is not null 
      drop table actiongroup
    go
    create table actiongroup(id   int, [action] varchar(20), groupid varchar(20)) 
    ----------- ----------------- ----------------- 
    insert actiongroup select 1 ,         'anzhuangluntan',    1 
    insert actiongroup select 2 ,         'guanlibanzhu'  ,    1 
    insert actiongroup select 3 ,         'guanlitiezi'   ,    1 
    insert actiongroup select 4 ,         'guanlibanzhu'  ,    2 
    insert actiongroup select 5 ,         'guanlitiezi'   ,    2 
    insert actiongroup select 6 ,         'guanlitiezi'   ,    3 
    go
    -->本例用自定义函数解决
    create function get_str(@id int)
    returns varchar(200)
    as
    begin
      declare @s varchar(200)
      select @s=isnull(@s+',','')+actionname from [action] where @id<=id
      return @s
    end
    go
    -->开始查询
    select *,dbo.get_str(groupid) actionname  from actiongroup
    -->结果
    /*
    id          action               groupid              actionname
    ----------- -------------------- -------------------- -----------------------------
    1           anzhuangluntan       1                    安装论坛,管理版主,管理帖子
    2           guanlibanzhu         1                    安装论坛,管理版主,管理帖子
    3           guanlitiezi          1                    安装论坛,管理版主,管理帖子
    4           guanlibanzhu         2                    管理版主,管理帖子
    5           guanlitiezi          2                    管理版主,管理帖子
    6           guanlitiezi          3                    管理帖子(6 行受影响)
    */
    -->删除自定义函数、测试表
    drop function dbo.get_str
    drop table actiongroup,[action]
      

  3.   

    多谢各位前辈的回复。不过好像是我表达的不够明确, 呵呵,action表的全部是这样的
    id          actionname        action              actioncolumnid
    ----------- ----------------- ------------         --------------
    1           安装论坛            anchuangluntan          1
    2           管理版主            guanlibanzhu            2
    3           管理帖子            guanlitiezi             3而我想要的结果是, 如果groupid为1的话输出
    id          actionname        action              actioncolumnid
    ----------- ----------------- ------------         --------------
    1           安装论坛            anchuangluntan          1
    2           管理版主            guanlibanzhu            2
    3           管理帖子            guanlitiezi             3如果groupid为2的话输出
    id          actionname        action              actioncolumnid
    ----------- ----------------- ------------         --------------
    2           管理版主            guanlibanzhu            2
    3           管理帖子            guanlitiezi             3
    如果groupid为3的话输出
    id          actionname        action              actioncolumnid
    ----------- ----------------- ------------         --------------
    3           管理帖子            guanlitiezi             3
    我想要的结果是数据行,而不是简单的字符串, 呵呵, 希望前辈们指点一下
      

  4.   

    -->生成测试数据
    if object_id('[action]') is not null 
      drop table [action]
    go
    create table [action](id   int, actionname varchar(20), [action] varchar(20))                            
    ----------- ----------------- ----------------- 
    insert [action] select 1  ,        '安装论坛',            'anchuangluntan'                                    
    insert [action] select 2  ,        '管理版主',            'guanlibanzhu'                                      
    insert [action] select 3  ,        '管理帖子',            'guanlitiezi'
    go
    if object_id('actiongroup') is not null 
      drop table actiongroup
    go
    create table actiongroup(id   int, [action] varchar(20), groupid varchar(20)) 
    ----------- ----------------- ----------------- 
    insert actiongroup select 1 ,         'anzhuangluntan',    1 
    insert actiongroup select 2 ,         'guanlibanzhu'  ,    1 
    insert actiongroup select 3 ,         'guanlitiezi'   ,    1 
    insert actiongroup select 4 ,         'guanlibanzhu'  ,    2 
    insert actiongroup select 5 ,         'guanlitiezi'   ,    2 
    insert actiongroup select 6 ,         'guanlitiezi'   ,    3 
    goselect a.*,b.id actioncolumnid 
    from [action] a
      join actiongroup b 
        on a.id=b.id
    where a.id >=1
    /*
    id          actionname           action               actioncolumnid
    ----------- -------------------- -------------------- --------------
    1           安装论坛                 anchuangluntan       1
    2           管理版主                 guanlibanzhu         2
    3           管理帖子                 guanlitiezi          3(3 行受影响)
    */
    select a.*,b.id actioncolumnid 
    from [action] a
      join actiongroup b 
        on a.id=b.id
    where a.id >=2
    /*
    id          actionname           action               actioncolumnid
    ----------- -------------------- -------------------- --------------
    2           管理版主                 guanlibanzhu         2
    3           管理帖子                 guanlitiezi          3(2 行受影响)
    */
    select a.*,b.id actioncolumnid 
    from [action] a
      join actiongroup b 
        on a.id=b.id
    where a.id >=3
    /*
    id          actionname           action               actioncolumnid
    ----------- -------------------- -------------------- --------------
    3           管理帖子                 guanlitiezi          3(1 行受影响)
    */这样?
      

  5.   

    你这个挺怪的,感觉是用[action]字段来联系两个表的?-->生成测试数据
    if object_id('[action]') is not null 
      drop table [action]
    go
    create table [action](id   int, actionname varchar(20), [action] varchar(20))                            
    ----------- ----------------- ----------------- 
    insert [action] select 1  ,        '安装论坛',            'anchuangluntan'                                    
    insert [action] select 2  ,        '管理版主',            'guanlibanzhu'                                      
    insert [action] select 3  ,        '管理帖子',            'guanlitiezi'
    go
    if object_id('actiongroup') is not null 
      drop table actiongroup
    go
    create table actiongroup(id   int, [action] varchar(20), groupid varchar(20)) 
    ----------- ----------------- ----------------- 
    insert actiongroup select 1 ,         'anchuangluntan',    1 
    insert actiongroup select 2 ,         'guanlibanzhu'  ,    1 
    insert actiongroup select 3 ,         'guanlitiezi'   ,    1 
    insert actiongroup select 4 ,         'guanlibanzhu'  ,    2 
    insert actiongroup select 5 ,         'guanlitiezi'   ,    2 
    insert actiongroup select 6 ,         'guanlitiezi'   ,    3 
    godeclare @id int
    set @id=3   --输入groupid
    select a.* from [action] a,actiongroup b where a.[action]=b.[action] and b.groupid=@id
      

  6.   


    if object_id('[action]') is not null 
      drop table [action]
    go
    create table [action](id   int, actionname varchar(20), [action] varchar(20))                            
    ----------- ----------------- ----------------- 
    insert [action] select 1  ,        '安装论坛',            'anchuangluntan'                                    
    insert [action] select 2  ,        '管理版主',            'guanlibanzhu'                                      
    insert [action] select 3  ,        '管理帖子',            'guanlitiezi'
    go
    if object_id('actiongroup') is not null 
      drop table actiongroup
    go
    create table actiongroup(id   int, [action] varchar(20), groupid varchar(20)) 
    ----------- ----------------- ----------------- 
    insert actiongroup select 1 ,         'anchuangluntan',    1 
    insert actiongroup select 2 ,         'guanlibanzhu'  ,    1 
    insert actiongroup select 3 ,         'guanlitiezi'   ,    1 
    insert actiongroup select 4 ,         'guanlibanzhu'  ,    2 
    insert actiongroup select 5 ,         'guanlitiezi'   ,    2 
    insert actiongroup select 6 ,         'guanlitiezi'   ,    3 
    goselect * from actionselect * from actiongroup
    --表连接
    select ag.id,a.actionname,ag.action
    from action a,actiongroup ag
    where a.action = ag.action
    and ag.groupid = 1
    --子查询
    select ag.id,actionname=(select actionname from action where action=ag.action),ag.action
    from actiongroup ag where ag.groupid = 1
    /**
    id          actionname           action               
    ----------- -------------------- -------------------- 
    1           安装论坛                 anchuangluntan
    2           管理版主                 guanlibanzhu
    3           管理帖子                 guanlitiezi(所影响的行数为 3 行)id          actionname           action               
    ----------- -------------------- -------------------- 
    1           安装论坛                 anchuangluntan
    2           管理版主                 guanlibanzhu
    3           管理帖子                 guanlitiezi(所影响的行数为 3 行)**/