我有两个表-> Order和OrderLine。Order包含标头信息,是一对多关系的1个方面。OrderLine包含组成订单的行,是多行中的一部分。
假设我有3个订单,每个订单都有自己的in,但是每个订单的订单行数据都是相同的,我认为这是重复的,但前提是组中的所有记录都是相同的。
为此,我尝试使用CheckSum_Agg,但它产生了大量的误报,导致不完全重复的记录被删除。
试图避免令人讨厌的、费力的嵌套游标。
有什么想法吗?
Post Edit:--CheckSum_Agg返回假阳性的示例...
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
发布于 2013-06-29 23:22:59
我认为CheckSum_Agg是一个很好的开始。您可能只在一列上执行CheckSum_Agg。如果您为您感兴趣的每个列执行一个CheckSum_Agg,您将能够找到所有重复的列。您对应用CheckSum_Agg不感兴趣的列可能只有OrderLine.id和OrderLine.OrderId。
下面是一个查询,如果两个订单相同,它将逐行检查:
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进行匹配,以查看它们是否匹配。如果它们都匹配,那么它们就是彼此的副本。
这可能是一个非常昂贵的操作。我建议使用包含完整外连接条件中的所有列的索引来加快速度。
发布于 2013-07-03 07:41:08
如果您允许在您的表中使用dupes,我建议您创建一个代理键,以便于删除。最好一开始就不允许它们,并有一个唯一的约束。但是试着用这个来清理。
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
https://stackoverflow.com/questions/17357950
复制相似问题