【问题标题】:How do I find related rows in Oracle SQL db如何在 Oracle SQL db 中查找相关行
【发布时间】:2019-07-12 11:58:27
【问题描述】:

使用类似这样的表格:

+-----------------+--------------------------+----------+
| CONTRACT_NUMBER | ORIGINAL_CONTRACT_NUMBER | CUST_ID| |
+-----------------+--------------------------+----------+
| 1               |                     0090 |      789 |
| 1-01            |                     0090 |      654 |
| 1-02            |                     0090 |      123 |
| 2               |                     0093 |      001 |
| 2 -01           |                     0093 |      001 |
| 3               |                     0094 |      666 |
| 4               |                     0095 |      999 |
| 4-01            |                     0095 |      888 |
| 5               |                     0096 |      002 |
| 5-01            |                     0096 |      002 |
| 6               |                     0097 |      555 |
+-----------------+--------------------------+----------+

我正在尝试整理没有重复的任何记录(即合同编号 3 和 6)以及有重复但具有相同 cust_id 的记录(即合同编号 2、2-01 和 5、5-01),其中唯一剩下的合同类型有多个条目,合同编号相同,但 cust_id 不同(即合同 1、1-01、1-02 和 4、4-01)。我需要这全部是 sql,因为我需要评估超过 14 万条记录

Oracle SQL 11g

我的代码没有任何进展。

预期的结果是这样的:

+-----------------+--------------------------+---------+
| CONTRACT_NUMBER | ORIGINAL_CONTRACT_NUMBER | CUST_ID |
+-----------------+--------------------------+---------+
| 1               |                     0090 |     789 |
| 1-01            |                     0090 |     654 |
| 1-02            |                     0090 |     123 |
| 4               |                     0095 |     999 |
| 4-01            |                     0095 |     888 |
+-----------------+--------------------------+---------+

【问题讨论】:

    标签: sql oracle duplicates


    【解决方案1】:

    正如您提到的,您希望输出合同号与唯一 ID 重复的输出,那么您可以利用存在来找出合同号具有多个唯一 ID 的情况,并以这种方式获取输出。

     with cte as (
     select '1'     as Contract_No, '0090' as  ORIGINAL_CONTRACT_NUMBER, '789' as Cust_ID 
     from dual union all 
     select '1-01'  as Contract_No, '0090' as  ORIGINAL_CONTRACT_NUMBER, '654' as Cust_ID 
    from dual union all 
    select '1-02'  as Contract_No, '0090' as  ORIGINAL_CONTRACT_NUMBER, '123' as Cust_ID 
    from dual union all 
    select '2'     as Contract_No, '0093' as  ORIGINAL_CONTRACT_NUMBER, '001' as Cust_ID 
    from dual union all 
     select '2 -01' as Contract_No, '0093' as  ORIGINAL_CONTRACT_NUMBER, '001' as Cust_ID 
     from dual union all 
     select '3'     as Contract_No, '0094' as  ORIGINAL_CONTRACT_NUMBER, '666' as Cust_ID 
     from dual union all 
     select '4'     as Contract_No, '0095' as  ORIGINAL_CONTRACT_NUMBER, '999' as Cust_ID 
     from dual union all 
      select '4-01'  as Contract_No, '0095' as  ORIGINAL_CONTRACT_NUMBER, '888' as 
      Cust_ID from dual union all 
      select '5'     as Contract_No, '0096' as  ORIGINAL_CONTRACT_NUMBER, '002' as 
      Cust_ID from dual union all 
      select '5-01'  as Contract_No, '0096' as  ORIGINAL_CONTRACT_NUMBER, '002' as 
      Cust_ID from dual union all 
      select '6'     as Contract_No, '0097' as  ORIGINAL_CONTRACT_NUMBER, '555' as 
      Cust_ID from dual) 
    

    查询:

     select * from cte  co 
     where   exists (select c1.ORIGINAL_CONTRACT_NUMBER,   count(distinct c1.cust_ID) 
     DifferentID  from cte c1 
                 where c1.ORIGINAL_CONTRACT_NUMBER = co.ORIGINAL_CONTRACT_NUMBER 
                  group by c1.ORIGINAL_CONTRACT_NUMBER
                  having count(distinct c1.cust_ID) > 1) ; 
    

    输出:

    CONTRACT_NO ORIGINAL_CONTRACT_NUMBER    CUST_ID
           1                    0090        789
           1-01                 0090        654
           1-02                 0090        123
           4                     0095       999
           4-01                  0095       888
    

    【讨论】:

      【解决方案2】:

      下面是一种方法-

      select * from MyTable where ORIGINAL_CONTRACT_NUMBER in (select
      ORIGINAL_CONTRACT_NUMBER from MyTable group by ORIGINAL_CONTRACT_NUMBER having count(distinct(cust_id))>1)
      

      希望对你有帮助

      【讨论】:

        【解决方案3】:

        试试这个...

        SELECT
                A.CONTRACT_NUMBER
              , A.ORIGINAL_CONTRACT_NUMBER
              , A.CUST_ID
        FROM
                CONTRACT_TABLE A
                INNER JOIN
                        (
                                SELECT
                                        CONTRACT_NUMBER
                                FROM
                                        CONTRACT_TABLE
                                GROUP BY
                                        CONTRACT_NUMBER
                                HAVING
                                        COUNT(DISTINCT CUST_ID) > 1
                        )
                        B
                        ON
                                A.CONTRACT_NUMBER = B.CONTRACT_NUMBER
        ORDER BY
                A.CONTRACT_NUMBER
        

        【讨论】:

          【解决方案4】:

          使用db<>fiddle在线测试:

          WITH
            t AS (
              SELECT '1' AS contract_number, '0090' AS original_contract_number,
                     '789' AS cust_id FROM dual UNION ALL
              SELECT '1-01',  '0090', '654' FROM dual UNION ALL
              SELECT '1-02',  '0090', '123' FROM dual UNION ALL
              SELECT '2',     '0093', '001' FROM dual UNION ALL
              SELECT '2 -01', '0093', '001' FROM dual UNION ALL
              SELECT '3',     '0094', '666' FROM dual UNION ALL
              SELECT '4',     '0095', '999' FROM dual UNION ALL
              SELECT '4-01',  '0095', '888' FROM dual UNION ALL
              SELECT '5',     '0096', '002' FROM dual UNION ALL
              SELECT '5-01',  '0096', '002' FROM dual UNION ALL
              SELECT '6',     '0097', '555' FROM dual
            ),
            a AS (
              SELECT t.*,
                COUNT(DISTINCT cust_id) OVER (PARTITION BY original_contract_number) q
              FROM t
            )
          SELECT
            contract_number, original_contract_number, cust_id
          FROM a
          WHERE q > 1;
          

          输出:

          +-----------------+--------------------------+---------+
          | CONTRACT_NUMBER | ORIGINAL_CONTRACT_NUMBER | CUST_ID |
          +-----------------+--------------------------+---------+
          | 1-02            |                     0090 |     123 |
          | 1-01            |                     0090 |     654 |
          | 1               |                     0090 |     789 |
          | 4-01            |                     0095 |     888 |
          | 4               |                     0095 |     999 |
          +-----------------+--------------------------+---------+
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-12-21
            • 1970-01-01
            • 1970-01-01
            • 2014-04-22
            • 2020-03-30
            • 1970-01-01
            • 1970-01-01
            • 2019-05-23
            相关资源
            最近更新 更多