2015-10-12 76 views
0

我有一個包含兩個進程ID(processIDA int,ProcessIDB int)的「衝突」表。SQL - 篩選器冗餘重複

當以任意順序(A/B或B/A)輸入到此「衝突」表中的2個進程時定義了唯一衝突。

的衝突表包含重複如下:

[row..1] ProcessIDA = ,ProcessIDB =

[row..2] ProcessIDB = ,ProcessIDA =

我需要做的是過濾掉重複的衝突使得我只剩:

[row..1] ProcessIDA = ,ProcessIDB =

注:本表的行可以在5之間變化,並且5000萬條記錄。一旦我可以成功地過濾出重複項,行數將會恰好是當前的一半。

+0

所以,你要刪除查詢? –

+0

只要where子句過濾器就沒問題(如果可能的話)。然後,我可以使用where子句刪除或執行其他查詢。 – TheLegendaryCopyCoder

回答

3

如果你想刪除重複項,然後

查詢

;with cte as 
(
    select *, 
    case when ProcessIDA < ProcessIDB 
    then ProcessIDA else ProcessIDB end as column1, 
    case when ProcessIDA < ProcessIDB 
    then ProcessIDB else ProcessIDA end as column2 
    from conflicts 
), 
cte2 as 
(
    select rn = row_number() over 
    (
     partition by cte.column1,cte.column2 
     order by cte.column1 
    ),* 
    from cte 
) 
delete from cte2 
where rn > 1; 

SQL Fiddle

1

你可以做一個簡單的自我加入

;WITH Conflicts AS 
(
    SELECT  * 
    FROM ( VALUES 
       (6, 5), 
       (5, 6), 
       (1, 2), 
       (1, 3) 
      ) Sample (ProcessIDA, ProcessIDB) 
) 
SELECT A.* 
FROM Conflicts A 
JOIN Conflicts B 
    ON A.ProcessIDA = B.ProcessIDB AND 
     A.ProcessIDB = B.ProcessIDA