2013-06-03 54 views
-1

我有一張表,其中包含一列具有唯一ID和一列與每個唯一ID的配偶ID(如果他們有配偶)。問題是,每個配偶ID也出現在唯一ID列中,所以當我拉出一個列表,試圖將一對夫婦作爲一個單位來對待時,我經常計算一對夫婦的雙重計數。保留一個重複的實例出現在兩列中的一列

什麼是一個好的,有效的方式來獲取給定的唯一ID列表,檢查他們的配偶是否也在同一個唯一ID列表中,並且每對夫婦只返回一個唯一的ID?

這個問題有點複雜,有時候夫妻雙方都不在同一份名單中,所以如果他們結婚,這不僅僅是一個人的問題。如果配偶不在同一個名單中,我想確保保留那個。我也想確保我保留所有在配偶ID列中具有NULL值的人。在問題表的

子集:

Unique_ID  Spouse_ID 
    1    2 
    2    1 
    3    NULL 
    4    NULL 
    5    10 
    6    25 
    7    NULL 
    8    9 
    9    8 
    10    5 

在該摘錄,ID的3,3,4和7都是單。 ID的1,2,5,8和9具有出現在Unique_ID列中的配偶。 ID 6有一個配偶,其ID不出現在Unique_ID列中。所以,我想保留ID的1(或2),3,4,5(或10),6,7和8(或9)。希望這是有道理的。

回答

1

我的傾向是將兩個清單合併並刪除重複:

select distinct id 
from ((select id 
     from t 
    ) union all 
     (select spouse_id 
     from t 
     where spouse_id in (select id from t) 
    ) 
    ) t 

但是,你的問題問的有效方式。想想這另一種方法是添加新列這是配偶的ID,如果在ID列表或返回NULL(此使用left outer join然後有三種情況:

  1. 沒有配偶的ID,所以使用id
  2. id是小於原來的ID,用它。
  3. 配偶ID小於原來的ID。丟棄這個記錄,因爲原來的被使用。

這裏一種明確的表達方式:

select IdToUse 
from (select t.*, tspouse.id tsid, 
      (case when tspouse.id is null then t.id 
        when t.id < tspouse.id then t.id 
        else NULL 
       end) as IdToUse 
     from t left outer join 
      t tspouse 
      on t.spouse_id = tspouse.id 
    ) t 
where IdToUse is not null; 

您可以簡化這:

select t.*, tspouse.id tsid, 
     (case when tspouse.id is null then t.id 
       when t.id < tspouse.id then t.id 
       else NULL 
      end) as IdToUse 
    from t left outer join 
     t tspouse 
     on t.spouse_id = tspouse.id 
    where tspouse.id is null or 
     t.id < tspouse.id 
0

兩個表只是普通的糟糕的設計
合併表

select id 
from table 
where id < spouseID 
    or spouseID is null 
+0

這是行不通的,但是,因爲有時配偶ISN不在同一張名單中。通過只保留小於其配偶身份證的身份證,我可能會丟失本應包含的身份證件。 – Ian

+0

兩張桌子簡直是不好的設計。合併表格。 – Paparazzi

+0

我不明白你在說什麼。數據不在兩個表格中。唯一ID和配偶ID是同一個表中的兩個獨立列。 – Ian

相關問題