[英]Best way to remove duplicated grouped data - SQL Server 2008
我有兩個表-> Order和OrderLine。 訂單包含標頭信息,並且是一對多關系的一面。 OrderLine包含組成訂單的行,並且有很多方面。
可以說我有3個訂單,每個訂單都有自己的ID,但是每個訂單行的數據都是相同的,我認為這是重復的,但前提是該組中的所有記錄都相同。
我已經嘗試過使用CheckSum_Agg,但是它會產生大量的誤報,導致刪除的記錄不是完全重復的。
試圖避免討厭的,費力的嵌套游標。
有任何想法嗎?
發布編輯:-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
我認為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匹配,以查看它們是否匹配。 如果它們都匹配,則它們是彼此重復的。
這可能是非常昂貴的操作。 我建議使用一個索引,該索引在完整的外部聯接critera中具有所有列,以加快此速度。
如果您允許在表中使用重復項,建議您創建一個代理密鑰以方便刪除。 最好不要在具有唯一約束的情況下首先使用它們。 但是,請嘗試清理。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.