2017-01-31 104 views
0

我有一個Oracle函數,我試圖從中選擇哪個將返回一個用戶列表或他們有權訪問的應用程序列表,具體取決於傳遞給它的參數。Oracle加入兩個SQL選擇函數

此帶回所有用戶的列表:

select * from TABLE(function_user('Users','')) 

此帶回所有應用程序的列表中的單個用戶訪問:

select * from TABLE(function_user('Apps','(Username)')) 

兩個函數返回一個叫做一列「 col_val」。

如何將兩次調用連接在一起以恢復所有用戶的列表以及他們有權訪問的應用程序的列表(兩列)?

我期待的佈局,看起來像這樣:

Username|Application 
User1|app1 
User1|app2 
User2|app1 
... 

任何幫助在此表示讚賞。

謝謝

+0

函數是如何工作的?它不是從'user_app'表中讀取嗎?爲什麼你不能直接從表中讀出你需要的東西?你爲什麼希望通過使用該表的函數開始執行此操作? – mathguy

+0

函數中存在複雜的邏輯 - 不幸的是,並不是從一組簡單的表中讀取,這就是爲什麼函數被構建的原因。 – AAA

回答

0

嘗試橫向線視圖:使用cross apply語法

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 
; 

另一種選擇(簡單一些):

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 
; 
+0

會不會交叉連接只給我兩個數據集的每個組合? – AAA

+0

這不是普通的交叉連接,而是[橫向交叉連接](https://oracle-base.com/articles/12c/lateral-inline-views-cross-apply-and-outer-apply-joins-12cr1)(也命名爲:橫向內聯視圖) - >「交叉連接橫向」 – krokodilko