表1 
col1(int)  col2(varchar(4))    --括号中为类型,下同
 1         1111                --表中数据,下同
 2         2222
 3         3333表2 
col3(int)  col4(varchar(40))
 11        ,1,2,3,            --此处col4中的值为表1中col1字段的集合最后查询的结果是要这样11  1111,2222,3333  --11为表2col3的值,1111,2222,3333 是col4中对应表1col2字段的集合请问如何写这个sql,多谢!备建表SQL:
create table tb1(col1 int,col2 varchar(4));
insert into tb1(col1,col2) values(1,'1111');
insert into tb1(col1,col2) values(2,'2222');
insert into tb1(col1,col2) values(3,'3333');create table tb2(col3 int,col4 varchar(40));
insert into tb2(col3,col4) values(1,',1,2,3,');

解决方案 »

  1.   

    ;WITH cte AS
    (
    SELECT m.col3, [value]=COALESCE(n.col2,m.col4) FROM
    (
    SELECT a.col3,b.col4 FROM
    (SELECT col3, col4=CAST('<Root><v>'+REPLACE(col4,',','</v><v>')+'</v></Root>' AS XML) FROM tb2) a
    OUTER APPLY
    (SELECT col4=R.v.value('.','varchar(100)') FROM a.col4.nodes('/Root/v') R(v)) b
    WHERE b.col4 <> ''
    ) m
    LEFT JOIN tb1 n
    ON m.col4 = n.col1
    )
    SELECT col3, [value]=','+STUFF((SELECT ','+[value] FROM cte WHERE col3=T.col3 FOR XML PATH('')),1,1,'')+','
    FROM cte T
    GROUP BY col3
    /*
    1 ,1111,2222,3333,
    */
      

  2.   


    create table t1
    (
    id int,
    col varchar(20)
    )
    insert into t1
    select 1,'1111' union all 
    select 2,'2222'  union all
    select 3,'3333' 
    create table t2
    (
    id int,
    col varchar(20)
    )
    insert into t2
    select 1,',1,2,3,'
    select * from t1
    select * from t2select t2.id,STUFF((select ','+col from t1 where charindex(','+ltrim(id),t2.col)>0 for xml path('')),1,1,'') as col from t2 
      

  3.   

    SQL2000
    begin tran
    create   table   tb1(col1   int,col2   varchar(4)); 
    go
    insert   into   tb1(col1,col2)   values(1, '1111 '); 
    insert   into   tb1(col1,col2)   values(2, '2222 '); 
    insert   into   tb1(col1,col2)   values(3, '3333 '); 
    go
    create   table   tb2(col3   int,col4   varchar(40)); 
    go
    insert   into   tb2(col3,col4)   values(1, ',1,2,3, ');
    go
    create function fn_get_lists(@col varchar(1000))
    returns varchar(1000)
    as
    begin
    declare @r varchar(1000)
    if isnull(@col, '') = '' return ''
    select @r = ''
    select @r = case @r when '' then '' else @r + ',' end + col2 from tb1 where
    charindex(',' + cast(col1 as varchar(4)) + ',', ',' + @col + ',') > 0 order by col1
    return @r
    end
    go
    select col3, dbo.fn_get_lists(col4) as col4 from tb2
    go
    drop table tb1 
    drop table tb2
    drop function fn_get_lists
    go
    rollback/*col3        col4                                                                                                                                                                                                                                                             
    ----------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
    1           1111,2222,3333
    */
      

  4.   

    合并列值 
    --*******************************************************************************************
    表结构,数据如下: 
    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) */ drop table tb /*
    标题:分拆列值1
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-11-20
    地点:广东深圳
    描述有表tb, 如下:
    id          value
    ----------- -----------
    1           aa,bb
    2           aaa,bbb,ccc
    欲按id,分拆value列, 分拆后结果如下:
    id          value
    ----------- --------
    1           aa
    1           bb
    2           aaa
    2           bbb
    2           ccc
    */--1. 旧的解决方法(sql server 2000)
    SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b SELECT A.id, value = SUBSTRING(A.[value], B.id, CHARINDEX(',', A.[value] + ',', B.id) - B.id)
    FROM tb A, # B
    WHERE SUBSTRING(',' + A.[value], B.id, 1) = ','DROP TABLE #--2. 新的解决方法(sql server 2005) 
    create table tb(id int,value varchar(30))
    insert into tb values(1,'aa,bb')
    insert into tb values(2,'aaa,bbb,ccc')
    go
    SELECT A.id, B.value
    FROM(
        SELECT id, [value] = CONVERT(xml,'<root><v>' + REPLACE([value], ',', '</v><v>') + '</v></root>') FROM tb
    )A
    OUTER APPLY(
        SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
    )BDROP TABLE tb/*
    id          value
    ----------- ------------------------------
    1           aa
    1           bb
    2           aaa
    2           bbb
    2           ccc(5 行受影响)
    */