现在如下表数据
f1      f2      C
a b 1
a d 3
b a 1
c b 2
c e 2
e c 2
假设有两个元组A、B,重复元组定义为A.f1=B.f2, A.f2=B.f1, A.c=B.c
例如表中的a b 1和b a 1就是一对重复的元组
现在要做的操作是:删除表中所有重复元组的其中一个元组,即只保留所有重复元组的其中一个。
请问高手如何写SQL语句,小弟感激不尽!!

解决方案 »

  1.   

    2005及以上版本可用:
    CREATE TABLE [#tb]
    (
        [f1]  varchar(10)   ,
        [f2]  varchar(10)   ,
        [C]  int 
    )
    GO--插入测试数据
    INSERT INTO [#tb] ([f1],[f2],[C])
        SELECT 'a','b','1' UNION
        SELECT 'a','d','3' UNION
        SELECT 'b','a','1' UNION
        SELECT 'c','b','2' UNION
        SELECT 'c','e','2' UNION
        SELECT 'e','c','2'
    GO
    SELECT * FROM [#tb];WITH CTE 
    AS 
    (
    SELECT * ,ROW_NUMBER()OVER(ORDER BY GETDATE())ROW
    FROM [#tb] t
    )
    delete t
    FROM CTE t
    WHERE  EXISTS(SELECT NULL FROM CTE WHERE t.f1=f2 AND t.f2=f1 AND t.c=c AND T.ROW>ROW)f1         f2         C
    ---------- ---------- -----------
    a          b          1
    a          d          3
    c          b          2
    c          e          2(4 row(s) affected)
      

  2.   

    create table tb( f1 char(2), f2 char(2), C int)
    insert into tb
    select 'a', 'b', 1 union all
    select 'a', 'd', 3 union all
    select 'b', 'a', 1 union all
    select 'c', 'b' ,2  union all
    select 'c', 'e', 2 union all
    select 'e', 'c', 2delete from tb  where exists ( select 1 from tb b where tb.f1=b.f2 and tb.f2=b.f1 and tb.c=b.c)
    select * from tb
    f1   f2   C
    ---- ---- -----------
    a    d    3
    c    b    2
      

  3.   

    能否简要解释一下这段SQL语句:
    ;WITH CTE 
    AS 
    (
        SELECT * ,ROW_NUMBER()OVER(ORDER BY GETDATE())ROW
        FROM [#tb] t
    )
    delete t
    FROM CTE t
    WHERE  EXISTS(SELECT NULL FROM CTE WHERE t.f1=f2 AND t.f2=f1 AND t.c=c AND T.ROW>ROW)
      

  4.   

    ;WITH CTE 
    AS 
    (
      SELECT * ,ROW_NUMBER()OVER(ORDER BY GETDATE())ROW
      FROM [#tb] t
    )
    select * from cte这一段只是利用了一下递归构造了一个表cte,比以前多了一个行号的列,然后就跟操作普通表一样的了。
      

  5.   


    delete tb from tb inner join
    (select f=f1,c from tb
    union--这里去掉重复的
    select f2,c from tb
    ) t on tb.f1=t.f1 and tb.c=t.c
    --这里按照f1列删除