Вам нужно получить все возможные значения emplid
и перекрестное соединение со всеми возможными значениями type
, а затем посмотреть, какие из них действительно существуют, используя внешнее соединение.
Например, если вы хотитеосновываясь исключительно на других данных в вашей таблице phone
, вы можете получить различные значения для первых двух столбцов, используя встроенные представления:
-- CTE for your sample data
with phone (emplid, type, phone) as (
select 1, 'HOME', 23452 from dual
union all select 2, 'HOME', 15284 from dual
union all select 2, 'BUSN', 25523 from dual
union all select 3, 'HOME', 26542 from dual
)
-- actual query
select e.emplid, t.type, p.phone
from (select distinct emplid from phone) e
cross join (select distinct type from phone) t
left join phone p on p.emplid = e.emplid and p.type = t.type;
EMPLID TYPE PHONE
---------- ---- ----------
1 HOME 23452
2 HOME 15284
2 BUSN 25523
3 HOME 26542
3 BUSN
1 BUSN
Но вы, возможно, действительно захотите получить возможные значения emplid
изскажем, таблица сотрудников - в этом случае вы увидите нулевые значения для всех сотрудников, даже если у них вообще не будет телефонных записей;и вы можете получить возможные значения type
из другой таблицы или жестко закодировать список:
select e.emplid, t.type, p.phone
from (select distinct emplid from phone) e -- or more likely from a separate employee table
cross join (select 'HOME' as type from dual union all select 'HOM2' from dual) t
left join phone p on p.emplid = e.emplid and p.type = t.type;
EMPLID TYPE PHONE
---------- ---- ----------
1 HOME 23452
2 HOME 15284
3 HOME 26542
1 HOM2
2 HOM2
3 HOM2
Я придерживался значения 'HOM2'
, которое вы использовали, даже если это не быловообще нет в ваших данных выборки;но, как вы можете видеть, вы получаете пустые записи для этого имени и для всех идентификаторов сотрудников.