Выберите оператор, в котором объединения приводят к исключению записей - PullRequest
1 голос
/ 23 октября 2019

У меня есть приведенный ниже запрос с несколькими объединениями. Последние 3 объединения необходимы для получения значения g.fin_id. Это работает отлично (см. Результаты), НО, поскольку некоторые записи в таблице ACCUM_ISS_CHAR_HIST имеют значения e.char9_nme, равные NULL, это исключает записи в результатах в целом. Таким образом, создается впечатление, что когда значение e.char9_nme имеет запись, оно выдаст результат, но как только оно получит значение Null, оно будет исключено. Я все еще хотел бы видеть записи, даже если g.fin_id для них будет пустым, поскольку они имеют значение e.char9_nme, равное Null. Как мне изменить запрос, чтобы выполнить это?

results here

select 
      a.acct_id, 
      c.fld3_txt, 
      b.issue_loc1_cde,
      b.instr_id, 
      a.fld1_nme, 
      b.issue_cls2_nme, 
      g.fin_id, 
      e.char9_nme 

from position_dg as a
     inner join 
     infoportal..issue_dg as b on b.INSTR_ID = a.INSTR_ID
     inner join 
     InfoPortal..IVW_ACCT as c on a.acct_id = c.acct_id
     inner join 
     InfoPortal..DW_AcctCharDG as d on a.acct_id = d.acctid
     inner join 
     ACCUM_ISS_CHAR_HIST as e on a.instr_id = e.instr_id
     inner join 
     MD_FINANCIAL_ENTITY as f on e.char9_nme = f.fin_enty_name 
     inner join md_FINANCIAL_ENTITY_ALTERNATE_IDENTIFIER as g on 
                f.fin_enty_id = g.fin_enty_id
                and b.MAT_EXP_DTE > getdate()
                and b.issue_cls1_nme = 'Derivatives'
                and a.as_of_tms >= getdate()-1
                and b.iss_typ in ('FFX','IRS','EQF')
                and d.AcctChrSetId = 'DerivativeRpt'
                and d.EndTms IS NULL
                and a.acct_id = 'FOGEMBLCR'
                and g.id_ctxt_typ = 'LEGAL_ENTITY_IDENTIFIER'
                and e.as_of_dte = (
                                   select MAX (as_of_dte)-1 
                                   from accum_iss_char_hist
                                  )

Я ожидаю, что результаты покажут записи fin_id для некоторых пустых записей fin_id для некоторых, но на данный момент толькоте, у которых есть запись fin_id, оставлены на месте, а остальные исключены из результатов.

1 Ответ

0 голосов
/ 23 октября 2019

Вы ищете левое соединение.

Соедините все эти таблицы (последние 3, как вы сказали) как левое соединение. Для большей ясности я переместил условия каждой таблицы в их предложение ON, а для базовой таблицы a сделал предложение where.

select 
      a.acct_id, 
      c.fld3_txt, 
      b.issue_loc1_cde, 
      b.instr_id, 
      a.fld1_nme, 
      b.issue_cls2_nme, 
      g.fin_id, 
      e.char9_nme 

from  position_dg as a
      inner join
      infoportal..issue_dg as b on b.INSTR_ID = a.INSTR_ID 
                                   and b.MAT_EXP_DTE > getdate()
                                   and b.issue_cls1_nme = 'Derivatives'
                                   and b.iss_typ in ('FFX','IRS','EQF')
      inner join 
      InfoPortal..IVW_ACCT as c on a.acct_id = c.acct_id
      inner join 
      InfoPortal..DW_AcctCharDG as d on a.acct_id = d.acctid
                                     and d.AcctChrSetId = 'DerivativeRpt'
                                     and d.EndTms IS NULL
      left join 
      ACCUM_ISS_CHAR_HIST as e on a.instr_id = e.instr_id 
                               and e.as_of_dte = (
                                         select MAX (as_of_dte)-1 
                                         from accum_iss_char_hist
                                                  )
      left join 
      MD_FINANCIAL_ENTITY as f on e.char9_nme = f.fin_enty_name 
      left join 
      md_FINANCIAL_ENTITY_ALTERNATE_IDENTIFIER as g on f.fin_enty_id = g.fin_enty_id 
                                          and g.id_ctxt_typ = 'LEGAL_ENTITY_IDENTIFIER'
Where a.as_of_tms >= getdate()-1
      and a.acct_id = 'FOGEMBLCR'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...