2017-01-31 2 views
0

Ich habe eine Oracle-Funktion, die ich auswählen möchte, die entweder eine Liste von Benutzern oder eine Liste von Anwendungen, die sie zugreifen können, abhängig von den Parametern zurück.Oracle Join zwei SQL-Select-Funktionen

Dies bringt eine Liste aller Benutzer zurück: return eine gerufene einzelne Spalte

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

beide Funktionen

":

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

Diese Liste aller Anwendungen ein einzelner Benutzer hat Zugriff zurück bringt col_val ".

Wie kann ich beide Aufrufe zusammenführen, um eine Liste aller Benutzer und die Liste der Anwendungen, auf die sie Zugriff haben (zwei Spalten), zurückzurufen?

Ich erwarte das Layout wie folgt aussehen:

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

Jede Hilfe zu diesem Thema sehr geschätzt wird.

Danke

+0

Wie funktioniert die Funktion in erster Linie? Liest es nicht aus einer 'user_app' Tabelle? Warum kannst du nicht direkt von diesem Tisch aus lesen, was du brauchst? Warum möchten Sie dies mit den Funktionen tun, die diese Tabelle verwenden? – mathguy

+0

Es gibt komplizierte Logik in der Funktion - leider nicht aus einer einfachen Reihe von Tabellen gelesen, weshalb die Funktion gebaut wurde. – AAA

Antwort

0

einen seitlichen Inline-View Versuchen:

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 
; 

Eine weitere Option (einfacher ein Bit) cross apply Syntax:

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 
; 

Verwenden outer apply, wenn einige Benutzer keine Zugriffsrechte haben. In diesem Fall zeigt die Abfrage immer noch den Benutzer, aber app_name Spalte in der Ergebnismenge ist null.

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

würde nicht das Kreuz beitreten geben Sie mir einfach jede Kombination aus beiden Datensätzen? – AAA

+0

Dies ist kein gewöhnlicher Cross-Join, aber [Querverknüpfung] (https://oracle-base.com/articles/12c/lateral-inline-views-cross-apply-and-outer-apply-joins-12cr1) (benannt auch: seitliche Inline-Ansicht) -> 'Kreuz seitlich verbinden' – krokodilko