SQL исключая строки с использованием INNER JOINs, генерирует ошибку: ожидается «UDFCALLNAME» (Teradata) - PullRequest
0 голосов
/ 27 февраля 2019

Соединение таблиц

У меня есть запрос, в котором я внутреннее объединение :

  1. первая таблица (A)
  2. второй стол (B)
  3. третий стол (C)

Исключить идентификаторы

Я хотел бы исключить строки , которые удовлетворяют некоторым условиям of (C), из результата объединения (A) с (B).

У меня есть запрос, как показано ниже, но я неполучать желаемые результаты.

Любая помощь с исключением ID s в (C) из (A x B) будет принята с благодарностью.Я хочу исключить ID s, которые находятся на этих лекарствах .

Ошибка

Я также получаю ошибку:

expected 'UDFCALLNAME' keyword between ')' and ')' 

SQL на Teradata

 select distinct first_visit.pat_id, 
            first_visit.PatientMRN, 
            first_visit.PatientName, 
            cast(contact_date as  date format 'yyyy-mm-dd') as visit_date, 
            first_visit.hsp_account_id as hsp_acct
from            
(
SELECT  distinct pat.pat_id,
    pat.PAT_MRN_ID as PatientMRN,
    pat.PAT_NAME as PatientName,
    contact_date,
    cast(pat.Birth_Date as  date format 'yyyy-mm-dd') as DOB,
    cast(contact_date as date) - cast( pat.birth_date as date) year (4) AS PatAge,
   enc.enc_type_c,
   dept.specialty,
   dept.department_name,
    specName.NAME,
    prov_name,
    acct.hsp_account_id     
FROM  Patient pat
inner JOIN  HSP_ACCOUNT acct on  acct.PAT_ID = pat.PAT_ID 
inner JOIN  Pat_enc enc on  enc.PAT_ID = pat.PAT_ID 
inner join clarity_ser_dept ser  on ser.prov_id = enc.visit_prov_id
inner join clarity_ser prov on prov.prov_id = ser.prov_id 
inner join CLARITY_SER_SPEC spec on enc.visit_prov_id = spec.PROV_ID 
inner join ZC_SPECIALTY specName on specName.SPECIALTY_C = spec.SPECIALTY_C and spec.LINE=1 and specName.NAME = 'xxx'
inner join CLARITY_DEP Dept on Dept.DEPARTMENT_ID = enc.DEPARTMENT_ID  and dept.specialty = specname.name
inner join CLARITY_LOC provLoc on provLoc.LOC_ID = Dept.REV_LOC_ID
where patAge > 55
and cast(contact_date as  date format 'mm/dd/yyyy') >= '10/01/2018'
and ACCT_CLASS_HA_C  =  '1207'
and acct.CODING_STATUS_C = 4 
and acct.ACCT_BILLSTS_HA_C NOT IN (40, 60, 99) 
AND SUBSTR(CAST (acct.HSP_ACCOUNT_ID AS VARCHAR(18)),4,1) IN ('1','3')
and enc_type_c  = '101'
group by 1,2,3,4,5,6,7,8,9,10,11,12
qualify row_number() over (partition by PatientMRN  order by contact_date DESC) =1) first_visit


inner join 
(select problem.pat_ID, edg.DX_ID, noted_date
from problem_list problem
inner join clarity_edg edg on problem.DX_ID = edg.DX_ID  
--where pat_id = '212000001293964'
and DX_name like any ('%Atrial FLutter%', '%Atrial Fib%')
) DX on DX.pat_id = first_visit.pat_id and DX.noted_date < first_visit.contact_date

/* exclude */
left  join 
(select distinct pat_id 
from (select pat_id from order_med ordmed
inner join RX_MED_TWO rxmed  on ordmed.medication_id = rxmed.medication_id 
inner join ZC_ADMIN_ROUTE  zc on ADMIN_ROUTE_C = zc.med_route_c 
where medication_name  like any ( '%Coumadin%',  '%Eliquis%'))) meds
on first_visit.pat_id = meds.pat_id 
where meds.pat_id is null;  

Спасибо!JH

1 Ответ

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

Во-первых, у вас есть куча проблем с вашим примером SQL.

Использование (Select * from A)Table_A в предложении FROM не нужно, так же как и A Table_A.Это упрощает ваш пример до следующего:

select distinct Table_ABC.id, 
                 Table_ABC.name,
         Table_ABC.Age 
 from
(
  A Table_A

  inner join (B Table_B on Table_A.id = Table_B.id) Table_AB

  inner join (C Table_C on Table_C.id <> TableAB.id and (condition)
)Table_ABC

Далее, если в таблицах A, B и C есть поле с именем id, тогда Table_ABC.id все еще будетнеоднозначный.Вместо этого укажите таблицу, которую вы хотите использовать для поля id.Я бы также избавился от псевдонимов Table_AB и Table_ABC.Я также подвергаю сомнению псевдонимы Table_A, Table_B и Table_C.Как правило, можно увидеть псевдонимы, чтобы сделать имена таблиц короче (если не использовать псевдонимы, чтобы избежать неоднозначности), но здесь вы делаете их длиннее .

select distinct Table_A.id, Table_A.name, Table_A.Age 
from A Table_A
  inner join B Table_B on Table_A.id = Table_B.id
  inner join C Table_C on Table_C.id <> Table_A.id and (condition)

Теперь, наконец,чтобы исключить совпадение соединения на C, выполните внешнее соединение и используйте предложение where для значений NULL, созданных внешним соединением.

select distinct Table_A.id, Table_A.name, Table_A.Age 
from A Table_A
  inner join B Table_B on Table_A.id = Table_B.id
  left outer join C Table_C on Table_C.id = Table_A.id and (condition)
where Table_C.id is NULL
...