Re: join against a function-result fails
От | David Johnston |
---|---|
Тема | Re: join against a function-result fails |
Дата | |
Msg-id | C919229E-2FF8-4BA8-BF91-266534861A1A@yahoo.com обсуждение исходный текст |
Ответ на | join against a function-result fails (Andreas <maps.on@gmx.net>) |
Список | pgsql-sql |
On Jul 27, 2012, at 21:57, Andreas <maps.on@gmx.net> wrote > Hi, > I have a table with user ids and names. > Another table describes some rights of those users and still another one describes who inherits rights from who. > > A function all_rights ( user_id ) calculates all rights of a user recursively and gives back a table with all userright_idsthis user directly has or inherits of other users as ( user_id, userright_id ). > > Now I'd like to find all users who have the right 42. > > > select user_id, user_name > from users > join all_rights ( user_id ) using ( user_id ) > where userright_id = 42; > > won't work because the parameter user_id for the function all_rights() is unknown when the function gets called. > > Is there a way to do this? > Suggest you write a recursive query that does what you want. If you really want to do it this way you can: With cte as (Select user_id, user_name, all_rights(user_id) as rightstbl) Select * from cte where (rightstbl).userright_id = 42; This is going to be very inefficient since you enumerate every right for every user before applying the filter. With a recursiveCTE you can start at the bottom of the trees and only evaluate the needed branches. David J.
В списке pgsql-sql по дате отправления: