Hello,
I've reviewed quite a few recursive examples online, but unable to yet find a solution to my issue. I'm either missing something obvious or unable to apply the concepts. It'll be great if someone can throw some ideas on this. I have a table like this:-
create table perms(mask int, desc varchar(100), order int);
insert into perms values(2,'select', 1);
insert into perms values(8,'enter', 1);
insert into perms values(32,'update', 1);
insert into perms values(128,'delete', 1);
I need to write a SQL which will give me the following output (the result is basically a cumulative sum of each mask value):-
('2', 'select', 1)
('10', 'select', 1)
('34', 'select', 1)
('42', 'select', 1)
('130', 'select', 1)
('138', 'select', 1)
('162', 'select', 1)
('170', 'select', 1)
('8', 'enter', 2)
('10', 'enter', 2)
('40', 'enter', 2)
('42', 'enter', 2)
('136', 'enter', 2)
('138', 'enter', 2)
('168', 'enter', 2)
('170', 'enter', 2)
('32', 'update', 3)
('34', 'update', 3)
('40', 'update', 3)
('42', 'update', 3)
('160', 'update', 3)
('162', 'update', 3)
('168', 'update', 3)
('170', 'update', 3)
('128', 'delete', 4)
('130', 'delete', 4)
('136', 'delete', 4)
('138', 'delete', 4)
('160', 'delete', 4)
('162', 'delete', 4)
('168', 'delete', 4)
('170', 'delete', 4)
Each number is basically a sum of combining one or more of the other. Just to get this to work, I can simply lay out the individual values since the final result is not huge, but was wondering if there'd be a way to programatically generate these out of the base values of 2,8,32,128.
So, 2, 10, 34...they all appear against 'select' because these resultant sum numbers are obtained only when the base value of '2' is in this sum. So, a 34 is achieved by adding 2 and 32. So, 34 would appear against select, which is a 2 and for update as well, which is 32. I wrote the below, but it's giving me the recursive sum only for one of the items (mostly because of the < operator).
with entitle_base_values(basemask, maskdesc, sortorder) as(
select 2, 'select', 1 union all
select 8, 'enter', 2 union all
select 32, 'update', 3 union all
select 128, 'delete', 4
),
sumval (maskdesc, maskvalue, sortorder)as
(
select cast(maskdesc as varchar(max)) maskdesc, cast(basemask as int) basemask, sortorder from entitle_base_values
union all
select sumval.maskdesc, t1.basemask+sumval.maskvalue maskvalue, sumval.sortorder from entitle_base_values t1
join sumval on sumval.maskvalue < t1.basemask
)
select distinct * from sumval order by 1,2
Any help would be greatly appreciated. Something could probably be tweaked in the above itself (or may be not). But, definitely need a fresh look. Thank you again.