我有一个Oracle功能,我试图从中选择一个用户列表或他们有权访问的应用程序列表,具体取决于传递给它的参数。
这会返回所有用户的列表:
select * from TABLE(function_user('Users',''))
这将返回单个用户有权访问的所有应用程序的列表:
select * from TABLE(function_user('Apps','(Username)'))
两个函数都返回一个名为" col_val"。
的列如何将两个调用联合起来以返回所有用户的列表以及他们有权访问的应用程序列表(两列)?
我希望布局看起来像这样:
Username|Application
User1|app1
User1|app2
User2|app1
...
对此有任何帮助表示赞赏。
谢谢
答案 0 :(得分:0)
尝试横向内联视图:
select x.column_value as user_name,
y.column_value as App_name
from table( function_user('Users','')) x
cross join lateral (
select *
from table( function_user('Apps', '('||x.column_value||')' ))
) y
;
使用cross apply
语法的另一个选项(更简单):
select x.column_value as user_name,
y.column_value as App_name
from table( function_user('Users','')) x
cross apply table( function_user('Apps', '('||x.column_value||')' )) y
;
当某些用户没有任何访问权限时,请使用outer apply
。在这种情况下,查询仍然显示用户,但结果集中的app_name
列为空。
select x.column_value as user_name,
y.column_value as App_name
from table( function_user('Users','')) x
outer apply table( function_user('Apps', '('||x.column_value||')' )) y
;