废话不多说,直接上图。然后通过图片来分析。1.大家可以看出我现在是3表联查,其实还有一个子孙表,要4表联查。先不说这么多了,
我现在要查询出来的C.ci_name这个值是要进行拼接的,因为这个是孙表,是一对多的关系,不知道会有多少行、
所以我在下面用了一种方式拼接起来,大家可以看出上面的语句直接查询出来有些编号就是重复的内容,因为最后的那个C.ci_name字段是多条。我要的效果1就是
时间  工单号 业务员  制单人  客户名称  产品名称  产品数量 部件名称(这个部件名称是拼接后的字符串名称).好吧,大神,先解决这个!满分奉上,这个问题解决了,我再开下帖说说子孙表里需要查询的东西。A是主表,B是子表,C是孙彪。

解决方案 »

  1.   


    有表tb, 如下:
    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. 旧的解决方法-- 1. 创建处理函数
    CREATE FUNCTION dbo.f_str(@id int)
    RETURNS varchar(8000)
    AS
    BEGIN
        DECLARE @r varchar(8000)
        SET @r = ''
        SELECT @r = @r + ',' + value
        FROM tb
        WHERE id=@id
        RETURN STUFF(@r, 1, 1, '')
    END
    GO
    -- 调用函数SELECt id, values=dbo.f_str(id) 
    FROM tb 
    GROUP BY id-- 2. 新的解决方法 
    -- 示例数据
    DECLARE @t TABLE(id int, value varchar(10))
    INSERT @t SELECT 1, 'aa'
    UNION ALL SELECT 1, 'bb'
    UNION ALL SELECT 2, 'aaa'
    UNION ALL SELECT 2, 'bbb'
    UNION ALL SELECT 2, 'ccc'-- 查询处理
    SELECT *
    FROM(
        SELECT DISTINCT 
            id
        FROM @t
    )A
    OUTER APPLY(
        SELECT 
            [values]= STUFF(REPLACE(REPLACE(
                (
                    SELECT value FROM @t N
                    WHERE id = A.id
                    FOR XML AUTO
                ), '<N value="', ','), '"/>', ''), 1, 1, '')
    )N/*--结果
    id          values
    ----------- ----------------
    1           aa,bb
    2           aaa,bbb,ccc
    (2 行受影响)
    --*/--各种字符串分函数--3.3.1 使用游标法进行字符串合并处理的示例。
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'b',3--合并处理
    --定义结果集表变量
    DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))--定义游标并进行合并处理
    DECLARE tb CURSOR LOCAL
    FOR
    SELECT col1,col2 FROM tb ORDER BY  col1,col2
    DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)
    OPEN tb
    FETCH tb INTO @col1,@col2
    SELECT @col1_old=@col1,@s=''
    WHILE @@FETCH_STATUS=0
    BEGIN
        IF @col1=@col1_old
            SELECT @s=@s+','+CAST(@col2 as varchar)
        ELSE
        BEGIN
            INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
            SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1
        END
        FETCH tb INTO @col1,@col2
    END
    INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
    CLOSE tb
    DEALLOCATE tb
    --显示结果并删除测试数据
    SELECT * FROM @t
    DROP TABLE tb
    /*--结果
    col1       col2
    ---------- -----------
    a          1,2
    b          1,2,3
    --*/
    GO
    /*==============================================*/
    --3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'b',3
    GO--合并处理函数
    CREATE FUNCTION dbo.f_str(@col1 varchar(10))
    RETURNS varchar(100)
    AS
    BEGIN
        DECLARE @re varchar(100)
        SET @re=''
        SELECT @re=@re+','+CAST(col2 as varchar)
        FROM tb
        WHERE col1=@col1
        RETURN(STUFF(@re,1,1,''))
    END
    GO--调用函数
    SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
    --删除测试
    DROP TABLE tb
    DROP FUNCTION f_str
    /*--结果
    col1       col2
    ---------- -----------
    a          1,2
    b          1,2,3
    --*/
    GO/*==============================================*/
    --3.3.3 使用临时表实现字符串合并处理的示例
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'b',3--合并处理
    SELECT col1,col2=CAST(col2 as varchar(100)) 
    INTO #t FROM tb
    ORDER BY col1,col2
    DECLARE @col1 varchar(10),@col2 varchar(100)
    UPDATE #t SET 
        @col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,
        @col1=col1,
        col2=@col2
    SELECT * FROM #t
    /*--更新处理后的临时表
    col1       col2
    ---------- -------------
    a          1
    a          1,2
    b          1
    b          1,2
    b          1,2,3
    --*/
    --得到最终结果
    SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1
    /*--结果
    col1       col2
    ---------- -----------
    a          1,2
    b          1,2,3
    --*/
    --删除测试
    DROP TABLE tb,#t
    GO
    /*==============================================*/--3.3.4.1 每组 <=2 条记录的合并
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'c',3--合并处理
    SELECT col1,
        col2=CAST(MIN(col2) as varchar)
            +CASE 
                WHEN COUNT(*)=1 THEN ''
                ELSE ','+CAST(MAX(col2) as varchar)
            END
    FROM tb
    GROUP BY col1
    DROP TABLE tb
    /*--结果
    col1       col2      
    ---------- ----------
    a          1,2
    b          1,2
    c          3
    --*/--3.3.4.2 每组 <=3 条记录的合并
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'b',3
    UNION ALL SELECT 'c',3--合并处理
    SELECT col1,
        col2=CAST(MIN(col2) as varchar)
            +CASE 
                WHEN COUNT(*)=3 THEN ','
                    +CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2))) as varchar)
                ELSE ''
            END
            +CASE 
                WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2) as varchar)
                ELSE ''
            END
    FROM tb a
    GROUP BY col1
    DROP TABLE tb
    /*--结果
    col1       col2
    ---------- ------------
    a          1,2
    b          1,2,3
    c          3
    --*/
    GO
    if not object_id('A') is null
        drop table A
    Go
    Create table A([id] int,[cname] nvarchar(2))
    Insert A
    select 1,N'张三' union all
    select 2,N'李四' union all
    select 3,N'王五' union all
    select 4,N'蔡六'
    Go
    --> --> 
     
    if not object_id('B') is null
        drop table B
    Go
    Create table B([id] int,[cname] nvarchar(5))
    Insert B
    select 1,N'1,2,3' union all
    select 2,N'3,4'
    Go
    create function F_str(@cname nvarchar(100))
    returns nvarchar(100)
    as
    begin 
    select @cname=replace(@cname,ID,[cname]) from A where patindex('%,'+rtrim(ID)+',%',','+@cname+',')>0
    return @cname
    end
    go
    select [id],dbo.F_str([cname])[cname] from Bid          cname
    ----------- ----------------------------------------------------------------------------------------------------
    1           张三,李四,王五
    2           王五,蔡六(2 個資料列受到影響)
    另外,给出一些测试的数据结构、表数据和测试结果。这样能更快的得到你需求所需要的。
      

  2.   

    参考:
    CREATE table tb(id int,col nvarchar(10))
    insert into tb select 1,'一' union all
    select 1,'二' union all
    select 1,'三' union all
    select 1,'四' union all
    select 1,'五'
    go
    select id,stuff((select ','+col from tb where id=a.id for xml path('')),1,1,'')linkcol 
    from tb a 
    group by id
    /*
    id          linkcol
    ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1           一,二,三,四,五(1 行受影响)*/
    go
    drop table tb
      

  3.   

    我现在的拼接不是一般的拼接,这是孙彪的数据拼接。其实我要的拼接并不是孙表的进行拼接,而是以孙表的我们看的ci_name字段为开始,然后在子孙表里有个跟它对象的,但是也是多条的名称。我们这里比如是di_name
    我要的结果是
    ci_name:di_name+di_namedi_namedi_namedi_name.....ci_name:di_name+di_namedi_namedi_namedi_name.....
    最终那列的值是这样的结果
      

  4.   

    分组合并:
    create table tb(级别 nvarchar(5), 兵种 nvarchar(5))
    insert into tb select '一级兵','农民'
    insert into tb select '一级兵','恶魔之子'
    insert into tb select '一级兵','花仙子' 
    insert into tb select '二级兵','弩手'
    insert into tb select '二级兵','角魔'
    insert into tb select '三级兵','精灵射手'
    insert into tb select '三级兵','地狱犬'
    insert into tb select '三级兵','护卫'
    go
    select 级别,stuff((select ','+兵种 from tb where 级别=a.级别 for xml path('')),1,1,'') from tb a group by 级别
    go
    drop table tb
    /*
    级别    
    ----- -----------------------------
    二级兵   弩手,角魔
    三级兵   精灵射手,地狱犬,护卫
    一级兵   农民,恶魔之子,花仙子(3 行受影响)
    */
      

  5.   

    declare @a table(id int,name varchar(20))
    insert into @a select 1,'a'
    insert into @a select 1,'b'
    insert into @a select 2,'a'select id, [value] = stuff((select ',' + [name] from @a  where id = t.id for xml path('')) , 1 , 1 , '')
    from @a t
    group by id
      

  6.   


    SQL环境2000?2005及以上,参照BOM节点(树形数据)和字符串拼接也就是2楼那种结合去做。树形数据的类似:
    -- 使用函数的方法:--建立 演示环境if object_id('tb_bookInfo') is not null drop table tb_bookInfo
    go
    create table tb_bookInfo(number int,name varchar(10),type int)
    insert tb_bookInfo
    select 1 ,'n1', 6 union all
    select 2 ,'n2', 3
    if object_id('tb_bookType') is not null drop table tb_bookType
    go
    create table tb_bookType(id int,typeName varchar(10),parentid int)
    insert tb_bookType
    select 1,'英语',0 union all
    select 2,'生物',0 union all
    select 3,'计算机',0 union all
    select 4,'口语',1 union all
    select 5,'听力',1 union all
    select 6,'数据库',3 union all
    select 7,'软件工程',3 union all
    select 8,'SQL Server',6select a.*,b.level from tb_bookInfo  a,f_getC(3) b  where a.type=b.id  order by b.level 
    /*
    number      name       type        level      
    ----------- ---------- ----------- -----------
    2           n2         3           0
    1           n1         6           1(所影响的行数为 2 行)
    */
    --查所有父结点
    if object_id('f_getP') is not null drop function f_getP
    go
    create function f_getP(@id int) 
    returns @re table(id int,level int) 
    as 
    begin
        declare @l int 
        set @l=0 
        insert @re select @id,@l 
        while @@rowcount>0 
        begin 
     set @l=@l+1
     insert @re select a.parentid,@l from tb_bookType a,@re b
     where a.id=b.id and b.level=@l-1 and a.parentid<>0
        end 
        update @re set level=@l-level
        return 
    end 
    go 
    --查所有子结点
    if object_id('f_getC') is not null drop function f_getC
    go
    create function f_getC(@id int) 
    returns @re table(id int,level int) 
    as 
    begin
        declare @l int 
        set @l=0 
        insert @re select @id,@l 
        while @@rowcount>0
        begin 
            set @l=@l+1
            insert @re select a.id,@l from tb_bookType as a,@re as b 
     where b.id=a.parentid and b.level=@l-1
        end
        return 
    end 
    go --查所有父子结点
    if object_id('f_getAll') is not null drop function f_getAll
    go
    create function f_getAll(@id int) 
    returns @re table(id int,level int) 
    as 
    begin 
        declare @l int 
        set @l=0 
        insert @re select @id,@l 
        while @@rowcount>0 
        begin 
     set @l=@l+1
     insert @re select a.parentid,@l from tb_bookType a,@re b
     where a.id=b.id and b.level=@l-1 and a.parentid<>0
        end 
        update @re set level=@l-level 
        while @@rowcount>0
        begin 
            set @l=@l+1
            insert @re select a.id,@l from tb_bookType as a,@re as b 
     where b.id=a.parentid and b.level=@l-1
        end
        return
    end 
    go  
     --删除演示drop table tb_bookInfodrop table tb_bookTypedrop function f_getPdrop function f_getC
    drop function f_getAll
    GO--sqlserver2005的新方法-- 建立演示环境
    IF OBJECT_ID('[Dept]') IS NOT NULL
        DROP TABLE [Dept]
    GO
    CREATE TABLE Dept(
     id int PRIMARY KEY,
     parent_id int,
     name nvarchar(20))
    INSERT Dept
    SELECT 1, 0, N'财务部' UNION ALL
    SELECT 2, 0, N'行政部' UNION ALL
    SELECT 3, 0, N'业务部' UNION ALL
    SELECT 4, 0, N'业务部' UNION ALL
    SELECT 5, 4, N'销售部' UNION ALL
    SELECT 6, 4, N'MIS' UNION ALL
    SELECT 7, 6, N'UI' UNION ALL
    SELECT 8, 6, N'软件开发' UNION ALL
    SELECT 9, 8, N'内部开发'
    GO
    --1、父-〉子
    -- 查询指定部门下面的所有部门
    DECLARE @Dept_name nvarchar(20)
    SET @Dept_name = N'MIS'
    ;WITH
    DEPTS AS(
     -- 定位点成员
     SELECT * FROM Dept WHERE name = @Dept_name
     UNION ALL
     -- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
     SELECT A.*  FROM Dept A, DEPTS B  WHERE A.parent_id = B.id
    )
    SELECT * FROM DEPTS
    GO
    --结果如下
    /*
    id          parent_id   name                
    ----------- ----------- --------------------
    6           4           MIS
    7           6           UI
    8           6           软件开发
    9           8           内部开发(所影响的行数为 4 行)
    */--2、子-〉父
    -- 查询指定部门下面的所有部门
    DECLARE @Dept_name nvarchar(20)
    SET @Dept_name = N'内部开发'
    ;WITH
    DEPTS AS(
     -- 定位点成员
      SELECT * FROM Dept WHERE name = @Dept_name
    --SELECT d.id,d.parent_id,d.name,convert(nvarchar(50),d.name) as parent  FROM Dept where @Dept_name
     UNION ALL
     -- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
     SELECT a.* FROM Dept a, DEPTS b WHERE a.id = b.parent_id
    )
    SELECT * FROM DEPTS
    GO--结果如下
    /*
    id          parent_id   name                
    ----------- ----------- --------------------
    9           8           内部开发
    8           6           软件开发
    6           4           MIS
    4           0           业务部(所影响的行数为 4 行)
    */-- 删除演示环境
    DROP TABLE Dept
    楼主给具体的表结构数据和结果来看看,顺便说明环境,不过看图貌似是05或08吧!
      

  7.   

    请给出测试数据和所需要的结果
    类似这样 
    tb
    col1 col2
    1     2
    1      3
    2      3
    3     4需要结果:
    col1   col2
    1       2,3
    2       3
    3     4
      

  8.   

    模拟数据。主表 A表
    id  name   user
    1    张三   zs
    2    王五   ww
    子表B表
    id  cusname cuuser cs_dh_id(跟主表的关系ID)
    32   全兴酒厂  qxjc    1
    34   五粮液    wly     2 
    孙表C表
    id  dhname hdueser dh_ci_id(跟子表的关系ID)
    56  汽车    cur      34
    57  火车    hc       32 
    58  飞机    fj       32
    59  自行车  zxc      32
      

  9.   

    子孙表 D1(这样的表有3张)  (主武器表)
    id kkname kkuser kk_p_id(跟孙表的关系)
    99 AK47     ddp      56
    100 M4    ds       56
    101 AWP    fd       56
    102 步枪    zd       57
    103 火箭    zd       59