Question

I can't find what's causing the error. All columns are qualified by their table names.

 SELECT 
 trunc(PAT_ENC.CONTACT_DATE,'MONTH') as MonthYear, 
appt.name, 
 PATIENT.PAT_NAME, 
 patient.pat_mrn_id,
 case when patient.sex_c=1 then 'Female' else 'Male' end Sex,
 zc_patient_race.name as Race,
 -- EPT_CSN.CSN,
 patient.birth_date,
 order_med.ordering_date,
 order_med.order_med_id,
 activemed.name name1,
--trunc((PAT_ENC.CONTACT_DATE-patient.birth_date)/365) as Age,
 CLARITY_DEP.DEPARTMENT_NAME, 
 ZC_DISP_ENC_TYPE.NAME name2, 
 CLARITY_SER_ENC.PROV_NAME, 
 --sched_pool_info.pool_Name,
 ZC_NOTE_SER.NAME name3,
 clarity_edg.current_icd10_list,
 clarity_edg.dx_name,
 zc_specialty.name name4
 --clarity_prc.prc_name,
 --pat_enc_appt_notes.line,
 --pat_enc_appt_notes.appt_note
 FROM  patient patient
 left join pat_enc on patient.pat_id=PAT_ENC.pat_id
 left JOIN CLARITY_DEP CLARITY_DEP ON PAT_ENC.DEPARTMENT_ID=CLARITY_DEP.DEPARTMENT_ID
 left JOIN CLARITY_LOC ON CLARITY_DEP.REV_LOC_ID=CLARITY_LOC.LOC_ID 
 left JOIN ZC_DISP_ENC_TYPE ZC_DISP_ENC_TYPE ON PAT_ENC.ENC_TYPE_C=ZC_DISP_ENC_TYPE.DISP_ENC_TYPE_C
 left JOIN CLARITY_SER CLARITY_SER_ENC ON PAT_ENC.VISIT_PROV_ID=CLARITY_SER_ENC.PROV_ID
 left JOIN ZC_NOTE_SER ZC_NOTE_SER ON CLARITY_SER_ENC.PROVIDER_TYPE_C=ZC_NOTE_SER.SERVICE_TYPE_C
 left join clarity_ser_Spec spec on pat_enc.visit_prov_id=spec.prov_id
 left join zc_specialty on spec.specialty_c=zc_specialty.specialty_c
 left join zc_appt_status appt on pat_enc.appt_status_c=appt.appt_status_c
 left join pat_enc_curr_meds on pat_enc.pat_enc_csn_id=pat_enc_curr_meds.pat_enc_csn_id
 left join order_med on pat_enc_curr_meds.current_med_id=order_med.Order_Med_Id
 left join clarity_medication activemed on order_med.medication_id=activemed.medication_id
 left join problem_list on pat_enc.pat_id=problem_list.pat_id
 left join clarity_edg on problem_list.dx_id=clarity_edg.dx_id
 left join patient_race on pat_enc.pat_id=patient_race.pat_id
 left join zc_patient_race on patient_race.patient_race_c=zc_patient_race.patient_race_c

left join (
 SELECT distinct  
 patient.PAT_ID,
 PATIENT.PAT_NAME, 
 CL_ELG.ALLERGEN_NAME, 
  ALLERGY.DESCRIPTION, 
 ZC_ALLERGEN_TYPE.NAME,
 ZC_ALRGY_STATUS.NAME
 FROM  patient
 left outer join ALLERGY ALLERGY ON PATIENT.PAT_ID=ALLERGY.PAT_ID 
 LEFT OUTER JOIN CL_ELG CL_ELG ON ALLERGY.ALLERGEN_ID=CL_ELG.ALLERGEN_ID
 LEFT OUTER JOIN ZC_ALRGY_STATUS ZC_ALRGY_STATUS ON ALLERGY.ALRGY_STATUS_C=ZC_ALRGY_STATUS.ALRGY_STATUS_C
 LEFT OUTER JOIN ZC_ALLERGEN_TYPE ZC_ALLERGEN_TYPE ON CL_ELG.ALLERGEN_TYPE_C=ZC_ALLERGEN_TYPE.ALLERGEN_TYPE_C
 WHERE  
 ZC_ALRGY_STATUS.NAME<>'Deleted' 
 AND ZC_ALLERGEN_TYPE.NAME in ('Drug Ingredient','Drug Class')
 and CL_ELG.allergen_name in ('CANAGLIFLOZIN',  'DAPAGLIFLOZIN',    'EMPAGLIFLOZIN',    'ERTUGLIFLOZIN')
 ) allergy1 on patient.pat_id=allergy1.pat_id
 
 left join (
  Select patient.pat_id,
 clarity_edg.current_icd10_list,
  clarity_edg.dx_name
 from problem_list left outer join patient on patient.pat_id=problem_list.pat_id
 left join clarity_edg on problem_list.dx_id=clarity_edg.dx_id
 where clarity_edg.current_icd10_list like 'E10%' or clarity_edg.current_icd10_list like 'O24%'
 ) exclusiondx on patient.pat_id=exclusiondx.pat_id
 
 inner join (
 /*+ no_index(order_results) no_index(order_proc) */ 
select distinct
patient.pat_id
,order_proc.order_proc_id
,comp.name as Component_Name
,order_results.ord_num_value
from
order_proc 
left join clarity_eap on order_Proc.proc_id=clarity_eap.proc_id
left join patient on order_proc.pat_id=patient.pat_id
left outer join order_results on Order_Proc.order_proc_id=order_results.order_proc_id
left outer join clarity_component comp on order_results.component_id=comp.component_id
where order_proc.ordering_date>=to_date('2019-05-01','YYYY-MM-DD') 
and order_proc.ordering_date<to_date('2020-08-01','YYYY-MM-DD')
and comp.name ='HEMOGLOBIN A1C' and order_results.ord_num_value>=7
) hg1lab on patient.pat_id=hg1lab.pat_id

left join (
/*+ no_index(order_results) no_index(order_proc) */ 
select distinct
patient.pat_id
,order_proc.order_proc_id
,clarity_eap.Proc_name
,comp.name as Component_Name
,order_results.ord_num_value
from
order_proc 
left join clarity_eap on order_Proc.proc_id=clarity_eap.proc_id
left join patient on order_proc.pat_id=patient.pat_id
left outer join order_results on Order_Proc.order_proc_id=order_results.order_proc_id
left outer join clarity_component comp on order_results.component_id=comp.component_id
where order_proc.ordering_date>=to_date('2019-07-01','YYYY-MM-DD') 
and order_proc.ordering_date<to_date('2020-08-01','YYYY-MM-DD')
and  comp.name in ('EGFR-AFRICAN AMERICAN',
'EGFR-ALL OTHER RACES') and order_results.ord_num_value<30
) exclusionlab on patient.pat_id=exclusionlab.pat_id


WHERE   PAT_ENC.CONTACT_DATE>=TO_DATE ('01-08-2018 00:00:01', 'DD-MM-YYYY HH24:MI:SS') 
and PAT_ENC.CONTACT_DATE<TO_DATE ('31-07-2020 00:00:01', 'DD-MM-YYYY HH24:MI:SS') 
and appt.name='Completed'
and activemed.name like 'METFORMIN%' 
and clarity_edg.current_icd10_list like 'E11%'
and (spec.line=1 or spec.line is null)
and allergy1.pat_id is null 
and exclusionlab.pat_id is null
and exclusiondx.pat_id is null
and (patient_race.line=1 or patient_race.line is null)
and  ZC_DISP_ENC_TYPE.NAME='Office Visit'
Was it helpful?

Solution

I see a few places where you have a table inside of a JOIN (...) block that has the same name and same alias as a table outside of that join.

For example, you have:

left join (
 SELECT distinct  
 patient.PAT_ID,
 PATIENT.PAT_NAME, 
 CL_ELG.ALLERGEN_NAME, 
  ALLERGY.DESCRIPTION, 
 ZC_ALLERGEN_TYPE.NAME,
 ZC_ALRGY_STATUS.NAME
 FROM  patient   -- Same table alias as main query
 --[...]
)
 ) allergy1 on patient.pat_id=allergy1.pat_id  

Try going through and renaming those table aliases inside the join clauses to something unique, like patient_allergy1 or patient_ag1 or something like that, to differentiate them from the same table name / table alias used elsewhere in the query.

So the above block would become something like:

left join (
 SELECT distinct  
 patient_ag1.PAT_ID,
 patient_ag1.PAT_NAME, 
 CL_ELG_ag1.ALLERGEN_NAME, 
  ALLERGY_ag1.DESCRIPTION, 
 ZC_ALLERGEN_TYPE_ag1.NAME,
 ZC_ALRGY_STATUS_ag1.NAME
 FROM  patient patient_ag1
 left outer join ALLERGY ALLERGY_ag1 ON patient_ag1.PAT_ID = ALLERGY_ag1.PAT_ID 
 LEFT OUTER JOIN CL_ELG CL_ELG_ag1 ON ALLERGY_ag1.ALLERGEN_ID = CL_ELG_ag1.ALLERGEN_ID
 LEFT OUTER JOIN ZC_ALRGY_STATUS ZC_ALRGY_STATUS_ag1 ON ALLERGY_ag1.ALRGY_STATUS_C = ZC_ALRGY_STATUS_ag1.ALRGY_STATUS_C
 LEFT OUTER JOIN ZC_ALLERGEN_TYPE ZC_ALLERGEN_TYPE_ag1 ON CL_ELG_ag1.ALLERGEN_TYPE_C = ZC_ALLERGEN_TYPE_ag1.ALLERGEN_TYPE_C
 WHERE  
 ZC_ALRGY_STATUS_ag1.NAME <> 'Deleted' 
 AND ZC_ALLERGEN_TYPE_ag1.NAME in ('Drug Ingredient','Drug Class')
 and CL_ELG_ag1.allergen_name in ('CANAGLIFLOZIN',  'DAPAGLIFLOZIN',    'EMPAGLIFLOZIN',    'ERTUGLIFLOZIN')
 ) allergy1 on patient.pat_id=allergy1.pat_id 

This is because the child query can reference columns from the parent query. There could be a line like AND patient_ag1.PAT_ID = patient.PAT_ID inside this join clause, referring back to a field in the parent query, for example. (I'm not saying that makes sense in this specific query, but the syntax is valid.) So Oracle is confused about which table you're referring to in these clauses because the subquery table names overlap the parent query table names, even though both are in scope.

Licensed under: CC-BY-SA with attribution
Not affiliated with dba.stackexchange
scroll top