Используйте NVL, GROUP BY, HAVING COUNT, чтобы проверить, совпадают ли записи - PullRequest
0 голосов
/ 24 мая 2018

У меня есть 2 таблицы: CUST_DETAILS со столбцами CUST_REF_ID и CUST_MERGE со столбцами NEW_CUST_REF_ID и OLD_CUST_REF_ID, приведенный ниже скрипт проверит, имеют ли оба столбца в CUST_MERGE одинаковый идентификатор страны с соответствующим столбцом вCUST_DETAILS и вернуть Y, иначе вернуть N

SELECT
   NVL
      ((SELECT 'Y' FROM DUAL WHERE EXISITS
       (
        SELECT CTRY_ID FROM CUST_DETAILS cust_dtl
        INNER JOIN CUST_MERGE cust_merge
        ON cust_dtl.CUST_REF_ID=cust_merge.NEW_CUST_REF_ID
        AND cust_dtl.CUST_REF_ID=cust_merge.OLD_CUST_REF_ID
        GROUP BY CTRY_ID
        HAVING COUNT(CTRY_ID)>1
        )),'N') AS SAME_CTRY_ID
FROM DUAL;

Все данные в обеих таблицах имеют одинаковый country_id, что означает ожидаемый результат «Y».Но 'N' вернулось пока, если только я не изменю условие с AND на OR, тогда оно будет работать так, как ожидалось, даже подзапрос также вернется с правильным идентификатором страны

Образец данных

TABLE CUST_MERGE

 NEW_CUST_REF_ID                        OLD_CUST_REF_ID

 B5000                                   B6000

 B5000                                   A6000

TABLE CUST_DETAILS

 CUST_REF_ID                CTRY_ID  
 B5000                       US

 B6000                       US   

 A6000                       JP

Когда выполнить первую строку в CUST_MERGE, B5000 и B6000, вернуть Y, так как ctry_id одинаковы (US) Когда выполнить второестрока в CUST_MERGE, B5000 и A6000, возврат N, поскольку ctry_id различны (США, JP)

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Используйте этот запрос, чтобы получить флаг:

SQL> WITH  CUST_MERGE( NEW_CUST_REF_ID, OLD_CUST_REF_ID) AS
  2    (SELECT 'B5000', 'B6000' FROM dual UNION ALL
  3     SELECT 'A5000', 'A6000' FROM dual),
  4  CUST_DETAILS (CUST_REF_ID,CTRY_ID) AS
  5   ( SELECT 'B5000', 'US' FROM dual UNION ALL
  6     SELECT 'B6000', 'US' FROM dual UNION ALL
  7     SELECT 'A5000', 'UK' FROM dual UNION ALL
  8     SELECT 'A6000', 'JP' FROM dual)
----------------------------
----End of Data Preparation
----------------------------
  9  SELECT cm.new_cust_ref_id,
 10         cm.old_cust_ref_id,
 11         dc.ctry_id,
 12         dc1.ctry_id,
 13         CASE
 14           WHEN dc.ctry_id = dc1.ctry_id THEN
 15            'Y'
 16           ELSE
 17            'N'
 18         END AS flag
 19    FROM cust_merge cm
 20    JOIN cust_details dc
 21      ON cm.new_cust_ref_id = dc.cust_ref_id
 22    JOIN cust_details dc1
 23      ON cm.old_cust_ref_id = dc1.cust_ref_id;

Выходные данные

NEW_CUST_REF_ID OLD_CUST_REF_ID CTRY_ID CTRY_ID FLAG
--------------- --------------- ------- ------- ----
B5000           B6000           US      US      Y
A5000           A6000           UK      JP      N

Запрос для ваших таблиц выглядит так:

SELECT cm.new_cust_ref_id,
       cm.old_cust_ref_id,
       dc.ctry_id, 
       dc1.ctry_id,
       CASE
         WHEN dc.ctry_id = dc1.ctry_id THEN
          'Y'
         ELSE
          'N'
       END AS flag
  FROM cust_merge cm
  JOIN cust_details dc
    ON cm.new_cust_ref_id = dc.cust_ref_id
  JOIN cust_details dc1
    ON cm.old_cust_ref_id = dc1.cust_ref_id;

Обновление : С новыми данными результаты будут такими, как ожидалось:

SQL> WITH  CUST_MERGE( NEW_CUST_REF_ID, OLD_CUST_REF_ID) AS
  2    (SELECT 'B5000', 'B6000' FROM dual UNION ALL
  3     SELECT 'B5000', 'A6000' FROM dual),
  4  CUST_DETAILS (CUST_REF_ID,CTRY_ID) AS
  5   ( SELECT 'B5000', 'US' FROM dual UNION ALL
  6     SELECT 'B6000', 'US' FROM dual UNION ALL
  7     SELECT 'A6000', 'JP' FROM dual)
  8  SELECT cm.new_cust_ref_id,
  9         cm.old_cust_ref_id,
 10         dc.ctry_id,
 11         dc1.ctry_id,
 12         CASE
 13           WHEN dc.ctry_id = dc1.ctry_id THEN
 14            'Y'
 15           ELSE
 16            'N'
 17         END AS flag
 18    FROM cust_merge cm
 19    JOIN cust_details dc
 20      ON cm.new_cust_ref_id = dc.cust_ref_id
 21    JOIN cust_details dc1
 22      ON cm.old_cust_ref_id = dc1.cust_ref_id;

Вывод:

NEW_CUST_REF_ID OLD_CUST_REF_ID CTRY_ID CTRY_ID FLAG
--------------- --------------- ------- ------- ----
B5000           B6000           US      US      Y
B5000           A6000           US      JP      N
0 голосов
/ 24 мая 2018
SELECT
m.CUST_REF_ID
FROM
CUST_MERGE M
INNER JOIN 
CUST_DETAILS D1 on 
(m.CUST_REF_ID=d1.NEW_CUST_REF_ID)
INNER JOIN 
CUST_DETAILS D2 on 
(m.CUST_REF_ID=d2.OLD_CUST_REF_ID)
WHERE d1.CTRY_ID=d2.CTRY_ID

Оберните это в свой код Y / N.(Я думаю) или, может быть,

SELECT 
crid
from
(
SELECT
OLD_CUST_REF_ID crid
from CUST_MERGE
UNION ALL
SELECT
NEW_CUST_REF_ID 
from CUST_MERGE
) as x inner join
CUST_DETAILS on x.crid=CUST_DETAILS.CUST_REF_ID 
group by CRID
HAVING (COUNT DISTINCT CTRY_ID)>1
...