Как найти связанные строки в Oracle SQL db - PullRequest
0 голосов
/ 19 февраля 2019

Используя таблицу, подобную этой:

+-----------------+--------------------------+----------+
| 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_ids (т. е. контракты 1,1-01,1-02 и 4, 4-01).мне нужно, чтобы это было все sql, так как есть более 140 тыс. записей, которые мне нужно оценить

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 |
+-----------------+--------------------------+---------+

Ответы [ 4 ]

0 голосов
/ 19 февраля 2019

Протестируйте его онлайн с 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 |
+-----------------+--------------------------+---------+
0 голосов
/ 19 февраля 2019

Ниже будет один путь -

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)

Надеюсь, это поможет

0 голосов
/ 19 февраля 2019

Попробуйте это ...

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
0 голосов
/ 19 февраля 2019

Как вы упомянули, что вы хотите выводить, когда номер контракта повторяется с уникальными идентификаторами, вы можете использовать существующий, чтобы выяснить случаи, когда у вас есть номер контракта, имеющий более одного уникального идентификатора, и получить вывод таким образом.

 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
...