簡體   English   中英

刪除重復的分組數據的最佳方法-SQL Server 2008

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM