Вот один из способов, который должен работать, он вернет 1 => IsEnrolled, если он существует, в противном случае он вернет 2 IsEnrolled
.
«Данные» должны имитировать ваши дваоператоры выбора.
with data as(
select 1 empId, 1 ISEnrolled from dual
union
select 2 empId, 1 ISEnrolled from dual
union
select 3 empId, 1 ISEnrolled from dual
union
select 4 empId, 1 ISEnrolled from dual
union
select 5 empId, 1 ISEnrolled from dual /** these 5 are mimicing your first select */
union
select 1 empId, 2 ISEnrolled from dual /** the next are the 'all' */
union
select 2 empId, 2 ISEnrolled from dual
union
select 3 empId, 2 ISEnrolled from dual
union
select 4 empId, 2 ISEnrolled from dual
union
select 5 empId, 2 ISEnrolled from dual
union
select 6 empId, 2 ISEnrolled from dual
union
select 7 empId, 2 ISEnrolled from dual
union
select 8 empId, 2 ISEnrolled from dual
union
select 9 empId, 2 ISEnrolled from dual
union
select 10 empId, 2 ISEnrolled from dual)
,
onlyOneIsEnrolled as (
select empId, isEnrolled
from data
where isEnrolled = 1
) ,
notInOneIsEnrolled as(
select empId, isEnrolled
from data d
where not exists(select null
from onlyOneIsEnrolled ooie
where ooie.empid = d.empId
)
)
select EmpId, isEnrolled
from onlyOneIsEnrolled
union
select EmpId, isEnrolled
from notInOneIsEnrolled
order by isEnrolled, EmpId
Это всего лишь один из способов выполнить задачу: onlyOneIsEnrolled
собирает все 1, а затем notInOneIsEnrolled
получает все emps
, не указанные выше, заключительную частьзапрос объединяет их.
Есть много способов выполнить эту задачу, это использует CTE , но в зависимости от ваших потребностей вы можете сделать это без использования with
пункт.