Несколько строк, несмотря на использование внешнего соединения - PullRequest
0 голосов
/ 03 января 2019

У меня есть 2 таблицы ниже

Paam Table
AssignmentID     PersonID         AssignmentType
300000014199240  300000014199145  E
300000014199174  300000014199145  ET

Par Table
ASGResponsID    AssignmentID    PersonID        Responsibility_Type
300000015244074 300000014199240 300000014199145 RC_HR_BP
300000015242351 300000014199240 300000014199145 RC_HR_BP
300000015244070 300000014199240 300000014199145 RC_HR_BP

Я хочу объединить эти 2 таблицы и получить вывод, как показано ниже

PersonID         Responsiblity_Type
300000014199145  RC_HR_BP

Я использую запрос ниже

select 
par.PersonID, par.Responsibility_Type 
from 
per_all_assignments_m paam, per_asg_responsibilities par
where
sysdate between nvl(paam.effective_start_date,sysdate) and 
nvl(paam.effective_end_date,sysdate)
and  paam.assignment_type='E'
and paam.assignment_id = par.assignment_id(+)
and paam.person_id = '300000014199145';

Вместо этого я получаю вывод, как показано ниже

PersonID         Responsiblity_Type
300000014199145  RC_HR_BP
300000014199145  RC_HR_BP
300000014199145  RC_HR_BP

Несмотря на использование левого внешнего соединения, я получаю несколько строк, почему это происходит?

Может кто-нибудь помочь мне понять?

Спасибо, Шивам

Ответы [ 2 ]

0 голосов
/ 03 января 2019

На основании ваших данных вы получаете правильные результаты. Все три строки в таблице параметров имеют одинаковый идентификатор присваивания (300000014199240), поэтому ваш запрос будет возвращен независимо от синтаксиса соединения.

Добавление предложения "Distinct" даст вам желаемые результаты.

select DISTINCT
  par.PersonID, par.Responsibility_Type 
from 
  per_all_assignments_m paam, per_asg_responsibilities par
where
  sysdate between nvl(paam.effective_start_date,sysdate) and 
  nvl(paam.effective_end_date,sysdate)
  and  paam.assignment_type='E'
  and paam.assignment_id = par.assignment_id(+)
  and paam.person_id = '300000014199145';

Я настроил это в SQL Fiddle здесь http://sqlfiddle.com/#!4/d7b7f/8. Примечание: я удалил ссылки на поля даты, так как вы не предоставили нам данные для них, но это не должно влиять на результаты в зависимости от того, как вы описали проблема.

0 голосов
/ 03 января 2019

Начните с использования обычного join с правильным синтаксисом:

select par.PersonID, par.Responsibility_Type 
from per_all_assignments_m paam join
     per_asg_responsibilities par
     on paam.assignment_id = par.assignment_id and
        paam.person_id = par.person_id  -- presumably also needed for the join
where sysdate between nvl(paam.effective_start_date, sysdate) and 
nvl(paam.effective_end_date, sysdate) and
      paam.assignment_type = 'E' and
      paam.person_id = '300000014199145';

Ваше намерение с внешним объединением может быть:

select par.PersonID, par.Responsibility_Type 
from per_asg_responsibilities par left join
     per_all_assignments_m paam
     on paam.assignment_id = par.assignment_id and
        paam.person_id = par.person_id  and
        sysdate between nvl(paam.effective_start_date, sysdate) and 
nvl(paam.effective_end_date, sysdate) and
        paam.assignment_type = 'E' and
where par.person_id = '300000014199145';
...