Another option could be
select *
from (
select min(view_level) over () as found_in_view, t.*
from (
select 1 view_level, v1.* from v1 where [your conditions]
union all
select 2 view_level, v2.* from v2 where [your conditions]
union all
select 3 view_level, v3.* from v3 where [your conditions]
) t
)
where view_level = found_in_view
which is getting data from all three views and then only keeping the level it was first found in. If you needed this by a group (eg by customer) than the analytic function could be modified accordingly