Trochę utknąłem. Chcę zrobić tabelę użytkownika role-relacja obrotu i moje zapytanie do tej pory wygląda następująco:Dynamic Oracle Pivot_In_Clause
WITH PIVOT_DATA AS (
SELECT *
FROM
(
SELECT USERNAME, GRANTED_ROLE
FROM [email protected]_LINK U LEFT OUTER JOIN [email protected]_LINK R
ON U.USERNAME = R.GRANTEE
)
)
SELECT *
FROM PIVOT_DATA
PIVOT
(
COUNT(GRANTED_ROLE)
FOR GRANTED_ROLE
IN('CONNECT') -- Just an example
)
ORDER BY USERNAME ASC;
To działa bardzo dobrze i spełnia swoje zadanie, ale nie chcę pisać napisać żadnej roli I chcesz wyszukać w pivot_in_clause
, ponieważ mamy ich tonę i nie chcę za każdym razem sprawdzać, czy są jakieś zmiany.
Więc czy istnieje sposób na napisanie SELECT
w pivot_in_clause
? Próbowałem sobie:
[...]
PIVOT
(
COUNT(GRANTED_ROLE)
FOR GRANTED_ROLE
IN(SELECT ROLE FROM [email protected]_LINK)
)
[...]
Ale to zawsze daje mi ORA-00936: „brakujące wyrażenie” w wierszu 1 całego zapytania i nie wiem dlaczego. Czy nie może być SELECT
w pivot_in_clause
lub czy robię to źle?
The Problem z twoim pragnieniem polega na tym, że liczba kolumn wyniku jest nieprzewidywalna/zmienna. –
@FlorinGhita: Tak, muszę uruchomić ten skrypt w 5 różnych instancjach bazy danych, a liczba ról jest inna. Dlatego chciałem mieć "dynamiczną" wersję tego skryptu. –
Możesz użyć PIVOT XML, a następnie użyć (any) jako klauzuli. Wadą jest to, że to do klienta należy przeanalizować xml. – dazedandconfused