【问题标题】:Is it possible to UNION distinct rows but disregard one column to determine uniqueness?是否可以联合不同的行但忽略一列来确定唯一性?
【发布时间】:2021-10-30 03:46:16
【问题描述】:
select d.id, d.registration_number
from DOCUMENTS d

union

select dd.id, dd.registration_number
from DIFFERENT_DOCUMENTS dd

是否可以仅根据 registration_number 的唯一性来合并这些结果,而忽略文档的 id

或者,是否有可能以不同的方式达到相同的结果?

补充一点:实际上我合并了 5 个查询,每行约 20 行长,在确定唯一性时应忽略 4 列。

【问题讨论】:

    标签: sql oracle select union


    【解决方案1】:

    你基本上需要用其他东西来包装联合数据,以便只得到你想要的。

    SELECT min(id), registration_number
    FROM   (SELECT id, registration_number
            FROM   documents 
            UNION ALL
            SELECT id, registration_number
            FROM   different_documents) 
    GROUP BY registration_number
    

    【讨论】:

      【解决方案2】:

      Union 将检查所有列的组合的唯一性。但是,您可以使用 union all(不会删除重复项),然后使用 row_number 窗口函数自己应用逻辑:

      SELECT id, registration_number
      FROM   (SELECT id, registration_number, 
                     ROW_NUMBER() OVER (PARTITION BY registration_number ORDER BY id) AS rn
              FROM   (SELECT id, registration_number
                      FROM   documents 
                      UNION ALL
                      SELECT id, registration_number
                      FROM   different_documents) u
             ) r
      WHERE  rn = 1
      

      【讨论】:

        【解决方案3】:

        既然其他答案已经正确,请问您为什么需要检索该查询中的其他列,因为主要目的似乎是收集唯一的注册号?

        首先收集唯一的注册号然后检索其他信息不是更简单吗?

        或者在您的实际查询中,首先收集不包含应该忽略的列的信息,然后在需要时收集这些列中的信息?

        例如,制作一个视图

        SELECT d.registration_number
          FROM DOCUMENT d
         UNION
        SELECT dd.registration_number
          FROM DIFFERENT_DOCUMENT dd
        

        然后使用该视图和 JOINS 收集信息?

        【讨论】:

          【解决方案4】:

          假设registration_number在每个表中都是唯一的,你可以使用not exists

          select d.id, d.registration_number
          from DOCUMENTS d
          union all
          select dd.id, dd.registration_number
          from DIFFERENT_DOCUMENTS dd
          where not exists (select 1
                            from DOCUMENTS d
                            where dd.registration_number = d.registration_number
                           );
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-18
            • 1970-01-01
            • 2015-05-03
            • 1970-01-01
            • 1970-01-01
            • 2014-10-02
            • 1970-01-01
            • 2011-04-12
            相关资源
            最近更新 更多