首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除重复分组数据的最佳方法- SQL Server 2008

删除重复分组数据的最佳方法- SQL Server 2008
EN

Stack Overflow用户
提问于 2013-06-28 13:42:50
回答 2查看 356关注 0票数 0

我有两个表-> Order和OrderLine。Order包含标头信息,是一对多关系的1个方面。OrderLine包含组成订单的行,是多行中的一部分。

假设我有3个订单,每个订单都有自己的in,但是每个订单的订单行数据都是相同的,我认为这是重复的,但前提是组中的所有记录都是相同的。

为此,我尝试使用CheckSum_Agg,但它产生了大量的误报,导致不完全重复的记录被删除。

试图避免令人讨厌的、费力的嵌套游标。

有什么想法吗?

Post Edit:--CheckSum_Agg返回假阳性的示例...

代码语言:javascript
运行
复制
Create Table #OrderLine(OrderId Int,ProductTypeId Int,ProductId Int);
Insert Into #OrderLine(OrderId,ProductTypeId,ProductId)
Values(1,1,5),(1,2,6),(2,1,6),(2,2,5)

Select CHECKSUM_Agg(ProductTypeId),CHECKSUM_Agg(ProductId)
From #OrderLine
Group By OrderId

Drop Table #OrderLine
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-29 23:22:59

我认为CheckSum_Agg是一个很好的开始。您可能只在一列上执行CheckSum_Agg。如果您为您感兴趣的每个列执行一个CheckSum_Agg,您将能够找到所有重复的列。您对应用CheckSum_Agg不感兴趣的列可能只有OrderLine.id和OrderLine.OrderId。

下面是一个查询,如果两个订单相同,它将逐行检查:

代码语言:javascript
运行
复制
with o as (
  select distinct orderid from orderline)
, ol as (select * from orderline)
select o1.orderid as o1, o2.orderid as o2
from o o1, o o2 
where o1.orderid <> o2.orderid and
0= (select count(*) 
          from (select * from ol where ol.orderid = o1.orderid) ol1 
          full outer join 
            (select * from ol where ol.orderid = o2.orderid) ol2 
            on ol1.producttypeid = ol2.producttypeid
            and ol1.productid = ol2.productid
          where (ol2.orderid is null or ol1.orderid is null))

这里有一个小提琴展示了它的实际效果:http://sqlfiddle.com/#!3/359e5/8

这里的想法是获得订单的所有对( o1,o2),并将o1的订单行ol1与o2的订单行ol2进行匹配,以查看它们是否匹配。如果它们都匹配,那么它们就是彼此的副本。

这可能是一个非常昂贵的操作。我建议使用包含完整外连接条件中的所有列的索引来加快速度。

票数 1
EN

Stack Overflow用户

发布于 2013-07-03 07:41:08

如果您允许在您的表中使用dupes,我建议您创建一个代理键,以便于删除。最好一开始就不允许它们,并有一个唯一的约束。但是试着用这个来清理。

代码语言:javascript
运行
复制
Create Table #OrderLine(Pk INT IDENTITY PRIMARY KEY, OrderId Int,ProductTypeId Int,ProductId Int);
Insert Into #OrderLine(OrderId,ProductTypeId,ProductId)
Values(1,1,5),(1,2,6),(2,1,6),(2,2,5),(1,1,5), (1,1,5)

--check
SELECT * FROM #OrderLine

--any dupes?
SELECT * FROM #OrderLine WHERE Pk NOT IN (
    Select Min(Pk)
    From #OrderLine
    Group By OrderId,ProductTypeId,ProductId
)

--delete the dupes
DELETE FROM #OrderLine WHERE Pk NOT IN (
    Select Min(Pk)
    From #OrderLine
    Group By OrderId,ProductTypeId,ProductId
)

--check
SELECT * FROM #OrderLine

Drop Table #OrderLine
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17357950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档