В Oracle 12C + вы можете использовать боковые объединения:
select t.groupid, v.nid
from t cross apply
(select t.nid1 as nid from dual union all
select t.nid2 as nid from dual
) v;
Это более эффективно, чем union all
, поскольку оно сканирует таблицу только один раз.
Вы также можете выразить это как:
select t.groupid,
(case when n.n = 1 then t.nid1 when n.n = 2 then t.nid2 end) as nid
from t cross join
(select 1 as n from dual union all select 2 from dual) n;
Немного сложнее, но все еще только один просмотр таблицы.