What is the big deal in views and functions? Are they upgrade proof? How frequently will you be querying that?
If used this for ten years and I think it is still version proof and works in MS SQL and Oracle and I've posted it before.
select
-- only resources with a defined link to an OBS unit
-- displays the full OBS unit path
srm_resources.id,
srm_resources.unique_name,
srm_resources.full_name,
prj_obs_types.id Type_id,
PRJ_obs_types.unique_name Type_unique,
PRJ_obs_types.name OBS_type_name,
prj_obs_units.ID OBS_ID,
prj_obs_units.Unique_name OBS_unique,
prj_obs_units.name OBS_name,
OBS_path.OBS_full_PATH
from
srm_resources,
prj_obs_units,
prj_obs_associations,
prj_obs_types,
(SELECT
prj_obs_types.name OBS_type_nAME,
(
ISNULL(Parent10.name,'') + ISNULL(Parent9.name + '/','') + ISNULL(Parent8.name+'/' ,'') + ISNULL(Parent7.name +
'/','') +
ISNULL(Parent6.name + '/','') +ISNULL(Parent5.name + '/','') + ISNULL(Parent4.name + '/','') + ISNULL(Parent3.name
+ '/','') +
ISNULL(Parent2.name + '/','') + ISNULL(Parent1.name + '/','') + prj_obs_units.name) OBS_full_PATH,
prj_obs_units.id OBS_unit_id
from
prj_obs_types,
prj_obs_units left join prj_obs_units Parent1 on prj_obs_units.parent_id=Parent1.id
left join prj_obs_units Parent2 on Parent1.parent_id=Parent2.id
left join prj_obs_units Parent3 on Parent2.parent_id=Parent3.id
left join prj_obs_units Parent4 on Parent3.parent_id=Parent4.id
left join prj_obs_units Parent5 on Parent4.parent_id=Parent5.id
left join prj_obs_units Parent6 on Parent5.parent_id=Parent6.id
left join prj_obs_units Parent7 on Parent6.parent_id=Parent7.id
left join prj_obs_units Parent8 on Parent7.parent_id=Parent8.id
left join prj_obs_units Parent9 on Parent8.parent_id=Parent9.id
left join prj_obs_units Parent10 on Parent9.parent_id=Parent10.id
where
prj_OBS_units.type_id=prj_obs_types.id
) as OBS_path
where
prj_obs_associations.record_id=srm_resources.id
AND prj_obs_associations.UNIT_ID=prj_obs_units.id
and prj_obs_associations.table_name= 'SRM_RESOURCES'
and prj_obs_types.id=prj_obs_units.type_id
and OBS_path.OBS_unit_id=prj_obs_units.id
and OBS_path.OBS_type_nAME=PRJ_obs_types.name
-- and srm_resources.is_active = 1
-- and prj_resources.prisopen = 1
-- and prj_resources.prtrackmode = 2
and srm_resources.last_name ='First_name'
and srm_resources.first_name ='Last_name'
and PRJ_obs_types.unique_name = 'OBS name'
Order by OBS_ID desc, srm_resources.full_name