表1:UserTagGroup 用户标签组表
UserTagGroupID    UserTagGroupName     UserTagGroupFieldName    RoleID
    1                设计师类型            DesignerType            1
    2                设计师擅长风格        DesignerStyle           1
    3                装修公司类型          CompanyType             2
    4                装修公司风格          CompanyStyle            2表2:UserTag 用户标签表
UserTagID         UserTagGroupID       UserTagValue
    1                 1                    家装
    2                 1                    公装
    3                 2                    欧式
    4                 2                    中式表3:User  用户表
UserID            UserName             RoleID
    1               liujia                1表4:UserTagDetail 用户标签详细表
UserTagDetailID    UserID              UserTagID
    1                1                     1
    2                1                     3
    3                1                     4
所需结果:
UserName   RoleID       DesignerType        DesignerStyle
  liujia     1            公装                欧式,中式

解决方案 »

  1.   

    要一条sql语句查询4个表的信息吗????
      

  2.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(我是小F,向高手学习)
    -- Date    :2010-02-03 15:40:20
    -- Version:
    --      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
    -- Nov 24 2008 13:01:59 
    -- Copyright (c) 1988-2005 Microsoft Corporation
    -- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
    --
    ----------------------------------------------------------------
    --> 测试数据:[UserTagGroup]
    if object_id('[UserTagGroup]') is not null drop table [UserTagGroup]
    go 
    create table [UserTagGroup]([UserTagGroupID] int,[UserTagGroupName] varchar(14),[UserTagGroupFieldName] varchar(13),[RoleID] int)
    insert [UserTagGroup]
    select 1,'设计师类型','DesignerType',1 union all
    select 2,'设计师擅长风格','DesignerStyle',1 union all
    select 3,'装修公司类型','CompanyType',2 union all
    select 4,'装修公司风格','CompanyStyle',2
    --> 测试数据:[UserTag]
    if object_id('[UserTag]') is not null drop table [UserTag]
    go 
    create table [UserTag]([UserTagID] int,[UserTagGroupID] int,[UserTagValue] varchar(4))
    insert [UserTag]
    select 1,1,'家装' union all
    select 2,1,'公装' union all
    select 3,2,'欧式' union all
    select 4,2,'中式'
    --> 测试数据:[User]
    if object_id('[User]') is not null drop table [User]
    go 
    create table [User]([UserID] int,[UserName] varchar(6),[RoleID] int)
    insert [User]
    select 1,'liujia',1
    --> 测试数据:[UserTagDetail]
    if object_id('[UserTagDetail]') is not null drop table [UserTagDetail]
    go 
    create table [UserTagDetail]([UserTagDetailID] int,[UserID] int,[UserTagID] int)
    insert [UserTagDetail]
    select 1,1,1 union all
    select 2,1,3 union all
    select 3,1,4
    --------------开始查询--------------------------
    select
      c.UserName,c.RoleID,
      max(case a.UserTagGroupFieldName when 'DesignerType' then b.UserTagValue else ''end) as 'DesignerType',
      max(case a.UserTagGroupFieldName when 'DesignerStyle' then b.UserTagValue else ''end) as 'DesignerStyle'
    from
      UserTagGroup a
    join
      UserTag b on a.UserTagGroupID=b.UserTagGroupID
    join
      [User] c on a.RoleID=c.RoleID
    join
      UserTagDetail d on c.UserID=d.UserID
    group by
      c.UserName,c.RoleID----------------结果----------------------------
    /* UserName RoleID      DesignerType DesignerStyle
    -------- ----------- ------------ -------------
    liujia   1           家装           中式(1 行受影响)
    */
      

  3.   

    ----------------结果----------------------------
    /* UserName RoleID      DesignerType DesignerStyle
    -------- ----------- ------------ -------------
    liujia   1           家装           中式
    结果还差一点
    ----------------结果----------------------------
    /* UserName RoleID      DesignerType DesignerStyle
    -------- ----------- ------------ -------------
       liujia   1           家装           欧式,中式
      

  4.   

    按道理说按照我写的出来应该结果是 然后再合并 楼主检查下
    /*
    UserName RoleID      DesignerType DesignerStyle
    -------- ----------- ------------ -------------
    liujia   1           家装           欧式
    liujia   1           家装           中式
    */(1 行受影响)
      

  5.   

    合并的就按照这个来好了
    合并列值 
    --*******************************************************************************************
    表结构,数据如下: 
    id    value 
    ----- ------ 
    1    aa 
    1    bb 
    2    aaa 
    2    bbb 
    2    ccc 需要得到结果: 
    id    values 
    ------ ----------- 
    1      aa,bb 
    2      aaa,bbb,ccc 
    即:group by id, 求 value 的和(字符串相加) 1. 旧的解决方法(在sql server 2000中只能用函数解决。) 
    --=============================================================================
    create table tb(id int, value varchar(10)) 
    insert into tb values(1, 'aa') 
    insert into tb values(1, 'bb') 
    insert into tb values(2, 'aaa') 
    insert into tb values(2, 'bbb') 
    insert into tb values(2, 'ccc') 
    go 
    --1. 创建处理函数 
    CREATE FUNCTION dbo.f_strUnite(@id int) 
    RETURNS varchar(8000) 
    AS 
    BEGIN 
        DECLARE @str varchar(8000) 
        SET @str = '' 
        SELECT @str = @str + ',' + value FROM tb WHERE id=@id 
        RETURN STUFF(@str, 1, 1, '') 
    END 
    GO 
    -- 调用函数 
    SELECt id, value = dbo.f_strUnite(id) FROM tb GROUP BY id 
    drop table tb 
    drop function dbo.f_strUnite 
    go
    /* 
    id          value      
    ----------- ----------- 
    1          aa,bb 
    2          aaa,bbb,ccc 
    (所影响的行数为 2 行) 
    */ 
    --===================================================================================
    2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。) 
    create table tb(id int, value varchar(10)) 
    insert into tb values(1, 'aa') 
    insert into tb values(1, 'bb') 
    insert into tb values(2, 'aaa') 
    insert into tb values(2, 'bbb') 
    insert into tb values(2, 'ccc') 
    go 
    -- 查询处理 
    SELECT * FROM(SELECT DISTINCT id FROM tb)A OUTER APPLY( 
            SELECT [values]= STUFF(REPLACE(REPLACE( 
                ( 
                    SELECT value FROM tb N 
                    WHERE id = A.id 
                    FOR XML AUTO 
                ), ' <N value="', ','), '"/>', ''), 1, 1, '') 
    )N 
    drop table tb /* 
    id          values 
    ----------- ----------- 
    1          aa,bb 
    2          aaa,bbb,ccc (2 行受影响) 
    */ --SQL2005中的方法2 
    create table tb(id int, value varchar(10)) 
    insert into tb values(1, 'aa') 
    insert into tb values(1, 'bb') 
    insert into tb values(2, 'aaa') 
    insert into tb values(2, 'bbb') 
    insert into tb values(2, 'ccc') 
    go select id, [values]=stuff((select ','+[value] from tb t where id=tb.id for xml path('')), 1, 1, '') 
    from tb 
    group by id /* 
    id          values 
    ----------- -------------------- 
    1          aa,bb 
    2          aaa,bbb,ccc (2 row(s) affected) */ 
      

  6.   

    我运行了 你的查询结果是
    /* UserName RoleID      DesignerType DesignerStyle 
    -------- ----------- ------------ ------------- 
      liujia  1          家装            中式