现在如下表数据
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语句,小弟感激不尽!!
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语句,小弟感激不尽!!
解决方案 »
- sql语句优化,select top 1 表1 where 某字段='*' order by 更新时间 DESC
- 高分求一个sql语句,紧急!
- 30分就这点了!请教Sql语句行数据的比较
- sql注册程序集(无法安装程序集***,因为现有策略阻止使用它。)
- 请问用什么方法可以看到数据库文件(db格式)中的数据?
- 关于sql2000的打包问题,installshield高手请进!!!!
- 如何从数据库中读取时间的时候把时分秒去掉
- 棘手啊,TEXT参数的处理,很急~~~
- [讨论]取得某一条数据在数据集中的定位
- 我想问几个lotusnotes domino的问题应该到哪里提问?
- SQL 横表转成树表 求助..
- ReportingService疑难问题
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)
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
;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)
AS
(
SELECT * ,ROW_NUMBER()OVER(ORDER BY GETDATE())ROW
FROM [#tb] t
)
select * from cte这一段只是利用了一下递归构造了一个表cte,比以前多了一个行号的列,然后就跟操作普通表一样的了。
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列删除