我现在数据库中有一表,该表有两列,一列是ID,一列是Test。然后该表有两条记录如下:id     test
1      1,3,5,7,8
2      2,3,6,7,9
求这两条记录相比多出来的部分。(结果是:2,6,9和1,5,8
也就是记录1比记录2:记录1中不包含记录2的2,6,9
和记录2比记录1:记录2中不包含记录1中的1,5,8请教一SQL语句,谢谢!

解决方案 »

  1.   

    SQL自定义函数也行,不要为存储过程。谢谢
      

  2.   

    CREATE table #tb(id int identity(1,1), test int)
    insert into #tb(test)
    select  '1,3,5,7,8'
    union select '2,3,6,7,9'
    with  ta as
    (
    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) 
    )B
    )
    select value from  ta  where id =1 
    except 
    select value from tb where id =2 
    在家没安装SQL没法测试,但是这个思路应该没问题
      

  3.   

    CREATE table tb(id int identity(1,1), test VARCHAR(20))
    insert into tb(test)
    select  '1,3,5,7,8'
    union select '2,3,6,7,9';WITH cte
    AS
    (
    SELECT t.id,SUBSTRING(t.test,m.number,1) AS test
     FROM tb t JOIN master.dbo.spt_values m ON LEN(t.test)>=m.number WHERE m.type='p' AND SUBSTRING(','+t.test,m.number,1)=','
     )
    SELECT * FROM cte a WHERE a.test NOT IN (SELECT test FROM cte WHERE id=2 ) AND a.id=1DROP TABLE dbo.tb
    /*
    id          test
    ----------- ----
    1           1
    1           5
    1           8(3 行受影响)
    */1不在2中的,2不在1类推
      

  4.   


    上面的稍微有点语法问题CREATE table #tb(id int identity(1,1), value varchar(40))
    insert into #tb(value)
    select  '1,3,5,7,8'
    union select '2,3,6,7,9'
    with  ta as
    (
    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) 
    )B
    )
    select value from  ta  where id =2 
    except 
    select value from ta where id =1 
    drop table #tb