现有表T1:
识别    关键词     内容
------------
         张三      
6        张三      中国     
         张三      中国北京2
         李四      33通过过滤语句,得到如下效果:识别    关键词     内容
------------
6        张三      中国 
         李四      33即,如关键词字段中有二条以上是相同的,则过滤后只保留一条,但如果识别中带有“6”的,保留有“6”的那一条,其余删除掉。请问这该如何写?谢谢。
         

解决方案 »

  1.   

    CREATE TABLE test
         (
           识别 INT ,
           关键词 VARCHAR(10) ,
           内容 VARCHAR(10)
         )
     
     INSERT  INTO test     
             SELECT  6 ,
                     '张三' ,
                     '中国'
             UNION ALL
             SELECT  NULL ,
                     '张三' ,
                     NULL
             UNION ALL
             SELECT  NULL ,
                     '张三' ,
                     '中国北京2'
             UNION ALL
             SELECT  NULL ,
                     '李四' ,
                     '33'
                     
     SELECT * FROM test a
     WHERE 关键词 IN ( 
     SELECT  关键词
     FROM    test 
     GROUP BY 关键词
     HAVING COUNT(1)>1) AND 识别 IS NOT NULL
     UNION ALL 
     SELECT * FROM test a
     WHERE 关键词 IN ( 
     SELECT  关键词
     FROM    test 
     GROUP BY 关键词
     HAVING COUNT(1)=1) 
     /*
     识别          关键词        内容
     ----------- ---------- ----------
     6           张三         中国
     NULL        李四         33
     
     (2 行受影响)
     
     */
      

  2.   

    有null的比较复杂
    CREATE TABLE test
         (
           识别 INT ,
           关键词 VARCHAR(10) ,
           内容 VARCHAR(10)
         )
     
     INSERT  INTO test     
             SELECT  6 ,
                     '张三' ,
                     '中国'
             UNION ALL
             SELECT  NULL ,
                     '张三' ,
                     NULL
             UNION ALL
             SELECT  NULL ,
                     '张三' ,
                     '中国北京2'
             UNION ALL
             SELECT  NULL ,
                     '李四' ,
                     '33'
             UNION ALL
             SELECT  NULL ,
                     '王五' ,
                     NULL
             UNION ALL
             SELECT  NULL ,
                     '王五' ,
                     '中国北京2'
                     
     SELECT * FROM test a
     where exists  (
    select 1
    from test b
    where b.关键词 = a.关键词
    and b.识别 = 6
    )
    and not exists (
    select 1
    from test b
    where b.关键词 = a.关键词
    and b.识别 = 6
    and isnull(a.识别,0) <> 6
    )
     or not exists  (
    select 1
    from test b
    where b.关键词 = a.关键词
    and b.识别 = 6
    )
      and not exists (
    select 1
    from test b
    where b.关键词 = a.关键词
    and (isnull(b.识别,0)< isnull(a.识别,0)
    or isnull(b.识别,0)= isnull(a.识别,0)
    and isnull(b.内容,'')> isnull(a.内容,'')
    )
    )--结果
    识别 关键词 内容
    6 张三 中国
    NULL 李四 33
    NULL 王五 中国北京2
      

  3.   

    我这个还复杂?很简单了咯,分成两部分,一部分是有多行,就取有表示的那行,另外一部分是只有一行的,那就保留,这个算法基本上已经没有压缩空间了。
    SELECT  *
    FROM    test a
    WHERE   关键词 IN ( SELECT 关键词
                     FROM   test
                     GROUP BY 关键词
                     HAVING COUNT(1) > 1 )
            AND 识别 IS NOT NULL
    UNION ALL
    SELECT  *
    FROM    test a
    WHERE   关键词 IN ( SELECT 关键词
                     FROM   test
                     GROUP BY 关键词
                     HAVING COUNT(1) = 1 )
      

  4.   


    CREATE TABLE test
         (
           识别 INT ,
           关键词 VARCHAR(10) ,
           内容 VARCHAR(10)
         )
     
     INSERT  INTO test     
             SELECT  6 ,
                     '张三' ,
                     '中国'
             UNION ALL
             SELECT  3 ,
                     '张三' ,
                     NULL
             UNION ALL
             SELECT  NULL ,
                     '张三' ,
                     '中国北京2'
             UNION ALL
             SELECT  NULL ,
                     '李四' ,
                     '33'
                     
    with yy as(
    select 识别,关键词,内容,ROW_NUMBER() over(partition by 关键词 order by 识别 desc)ROW
    from test )
    select 识别,关键词,内容 from yy where ROW=1
    结果 
    识别          关键词        内容
    ----------- ---------- ----------
    6           ?三         中?
    NULL        李四         33(2 row(s) affected)
    因为是港版系统,有点乱码了