Удалить дубликаты результатов из запроса Oracle - PullRequest
0 голосов
/ 29 июня 2018

Заранее спасибо за помощь.
Это запрос, который дает дополнительный результат:

SELECT DISTINCT npi.id_provider AS npi_provider,
  mcnpi.num_contract_max                   AS num_contract_max,
  mcd.id_provider                          AS mcd_provider,
  provservloc.dte_effective                AS dte_effective,
  provservloc.dte_end                      AS dte_end,
--Case modified to pull condition from t_pmp_svc_loc for when dte_end > today
CASE
    WHEN provservloc.dte_end > 20180611 THEN 
        CASE WHEN mcfte.dte_end > 20180611 THEN mcfte.num_hrs_week ELSE 0 END
    ELSE 0 END                          AS num_hrs_week,
--Case added to handle Num_Current_Panel results
CASE
    WHEN provservloc.dte_end > 20180611 THEN
        CASE WHEN mcfte.dte_end > 20180611 THEN pmppanelrestrict.num_current_panel ELSE 0 END
    ELSE 0 END                       AS num_current_panel,
--Case added to handle Num_Future_Panel
CASE
    WHEN provservloc.dte_end > 20180611 THEN
        CASE WHEN mcfte.dte_end > 20180611 THEN pmppanelrestrict.num_future_panel ELSE 0 END
    ELSE 0 END                       AS num_future_panel,
--Case added to handle Num_Max_Panel numbers
CASE
    WHEN provservloc.dte_end > 20180611 THEN
        CASE WHEN mcfte.dte_end > 20180611 THEN pmppanelrestrict.num_max_panel ELSE 0 END
    ELSE 0 END                       AS num_max_panel,
  pmppanelrestrict.ind_panel_hold    AS ind_panel_hold,
  mcnpi.sak_npi              AS sak_npi ,
  provservloc.sak_prov,
  provservloc.sak_prov_loc
FROM t_pmp_svc_loc provservloc
  LEFT JOIN T_PR_IDENTIFIER MCD ON PROVSERVLOC.SAK_PROV_LOC = MCD.SAK_PROV_LOC AND PROVSERVLOC.SAK_PROV = MCD.SAK_PROV
  INNER JOIN t_pr_identifier npi on npi.sak_prov_loc = mcd.sak_prov_loc AND npi.sak_prov = mcd.sak_prov
  LEFT JOIN t_mc_fte mcfte ON provservloc.sak_prov = mcfte.sak_prov AND provservloc.sak_prov_loc = mcfte.sak_prov_loc
  LEFT JOIN t_mc_pmp_panel_restrict pmppanelrestrict ON provservloc.sak_pmp_ser_loc = pmppanelrestrict.sak_pmp_ser_loc
  LEFT JOIN t_mc_npi mcnpi ON mcnpi.sak_npi = mcd.sak_npi
  LEFT JOIN t_pr_php_elig elig ON provservloc.sak_prov_loc = elig.sak_prov_loc
WHERE 
PROVSERVLOC.SAK_PUB_HLTH       = 23
AND elig.sak_prov_pgm          = 57
AND elig.cde_enroll_status     IN ( 'A' ,'G', 'X' )
AND mcfte.cde_status1          != 'H'
AND mcd.cde_prov_id_type        = 'MCD'
AND NPI.CDE_PROV_ID_TYPE        = 'NPI'
AND npi.id_provider                = '123456789'

UNION

SELECT DISTINCT npi.id_provider AS npi_provider,
  mcnpi.num_contract_max                   AS num_contract_max,
  mcd.id_provider                          AS mcd_provider,
  provservloc.dte_effective                AS dte_effective,
  provservloc.dte_end                      AS dte_end,
NULL AS NUM_HRS_WEEK,
NULL AS num_current_panel,
NULL AS NUM_FUTURE_PANEL,
NULL AS num_max_panel,
NULL  AS ind_panel_hold,
  mcnpi.sak_npi              AS sak_npi ,
  provservloc.sak_prov,
  provservloc.sak_prov_loc
FROM t_pmp_svc_loc provservloc
  LEFT JOIN T_PR_IDENTIFIER MCD ON PROVSERVLOC.SAK_PROV_LOC = MCD.SAK_PROV_LOC AND PROVSERVLOC.SAK_PROV = MCD.SAK_PROV
  INNER JOIN T_PR_IDENTIFIER NPI ON NPI.SAK_PROV_LOC = MCD.SAK_PROV_LOC AND NPI.SAK_PROV = MCD.SAK_PROV
  LEFT JOIN t_mc_npi mcnpi ON mcnpi.sak_npi = mcd.sak_npi
  LEFT JOIN T_PR_PHP_ELIG ELIG ON PROVSERVLOC.SAK_PROV_LOC = ELIG.SAK_PROV_LOC
WHERE PROVSERVLOC.SAK_PROV  NOT IN (SELECT A.SAK_PROV FROM T_MC_FTE A INNER JOIN T_PMP_SVC_LOC B ON A.SAK_PROV = B.SAK_PROV)
AND PROVSERVLOC.SAK_PROV_LOC   not in (select a.sak_prov_loc from t_mc_fte a inner join t_pmp_svc_loc b on a.sak_prov_loc = b.sak_prov_loc)   
and provservloc.sak_pub_hlth       = 23
AND elig.sak_prov_pgm              = 57
AND ELIG.CDE_ENROLL_STATUS        IN ( 'A' ,'G', 'X' )
--AND mcfte.cde_status1          != 'H'
AND mcd.cde_prov_id_type        = 'MCD'
AND NPI.CDE_PROV_ID_TYPE        = 'NPI'
AND npi.id_provider                = '123456789';

В списке результатов я получаю 5 строк. Это выглядит так:
Query_Result

Я знаю, что проблема в основном в двух таблицах:
1. T_MC_FTE

SAK_PROV_LOC   SAK_PROV DTE_EFFECTIVE    DTE_END
------------ ---------- ------------- ----------
       32254      32254      20150401   20160331
       32254      32254      20171001   22991231
  1. T_PMP_SVC_LOC

    SAK_PROV_LOC   SAK_PROV DTE_EFFECTIVE    DTE_END
    ------------ ---------- ------------- ----------
           30859      30859      20050101   20090630
           32254      32254      20050401   20110630
           32254      32254      20150401   20160331
           32254      32254      20171001   22991231  
    

    значение, которое мне не нужно, это значение в таблице T_MC_FTE с DTE_END = 20160331.
    Итак, в основном я ищу, чтобы получить все результаты от T_PMP_SVC_LOC, и те, которые соответствуют T_MC_FTE, только если T_MC_FTE.DTE_END> сегодня. В итоге результатом должны быть все 4 строки из T_PMP_SVC_LOC с соответствующими значениями столбцов для одной записи, которая сопоставляется в T_MC_FTE с DTE_END> сегодня;

Есть предложения по улучшению UNION?

1 Ответ

0 голосов
/ 29 июня 2018

Самое простое решение - это сделать

select distinct npi_provider, 
                num_contract_max, 
                mcd_provider ...
from (
  your select statement 
)

Однако это может снизить эффективность запроса. Попробуйте изменить дизайн запроса, чтобы вообще не использовать union и distinct.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...