【问题标题】:Keep one instance of duplicate appearing in one of two columns保持一个重复实例出现在两列之一中
【发布时间】:2013-06-03 14:40:30
【问题描述】:

我有一个表,其中包含一个具有唯一 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、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)。希望这是有道理的。

【问题讨论】:

    标签: sql tsql duplicates uniqueidentifier


    【解决方案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. 没有配偶身份证,所以用身份证
    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
    

    【讨论】:

      【解决方案2】:

      两张桌子只是糟糕的设计
      合并表格

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

      【讨论】:

      • 这不起作用,因为有时配偶不在同一个列表中。如果只保留小于其配偶 ID 的 ID,我可能会输掉本应包括在内的案件。
      • 两张表只是糟糕的设计。合并表格。
      • 我不明白你在说什么。数据不在两个表中。唯一 ID 和配偶 ID 是同一个表中的两个单独的列。
      • 那你为什么说“不在同一个列表中”。阅读我的答案。两列:一个 id 两个配偶 ID。发布表格设计。
      • 我说“不在同一个列表中”,因为有时我会获取数据的一个子集,其中只有一个配偶符合拉动的标准。在这种情况下,我想保留所有配偶未出现在列表中的已婚人士(即,将他们视为单身人士,因为无论出于何种意图和目的,他们在我的列表中都是“单身”)。我将发布表格结构的摘录,让您了解我在说什么。
      猜你喜欢
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 2020-04-15
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多