2017-02-03 9 views
0

Итак, у меня есть таблица:Несколько профсоюзов в Oracle Sql без каких-либо дубликатов на определенном столбце

id place user  role 
____________________________ 
1 a  u1  emp  
2 a  u2  emp  
3 a  u3  smallBoss 
4 b  u4  emp 
5 b  u5  emp 
6 b  u6  smallBoss 
7 b  u7  medBoss 

Теперь я хочу, чтобы создать представление с этими пользователями и их боссами в дополнительной колонке с этими правилами:

1 - если у пользователя есть smallBoss у его места, smallBoss находится в boss колонке независимо от того, что !!!

2 - если пользователь не имеет smallBoss на своем месте, то medBoss в boss колонке, если он присутствует, но если нет, то bigBoss босс

3 - очевидно, smallBoss на месте b будет иметь medBoss в его boss колонке

4 - bigBoss является последний вариант

Вывод: боссы имеют какие-то обратные приоритеты:

1 - smallBoss - если он присутствует, то он, безусловно, босс для emp

2 - medBoss - если он присутствует, он босс для всех smallBoss и если там нет smallBoss на месте, то он босс для все эх

3 - «BigBoss» - он присутствует везде, но должен быть только босс для medBoss и emp где ни smallBoss, ни medBoss присутствует.

Я попытался присоединиться к версиям и объединению. Союз, кажется, ближе всего к моей цели, но у меня есть несколько пользователей с разными боссами (пользователи u4 и u5 удваиваются !!!). Я хочу u4 и u5, чтобы показать только один раз с smallBoss в их boss колонки:

id place user  role   boss 
___________________________________________ 
1 a  u1  emp   smallBoss 
2 a  u2  emp   smallBoss 
3 a  u3  smallBoss  bigBoss 
4 b  u4  emp   smallBoss 
5 b  u5  emp   smallBoss 
6 b  u6  smallBoss  medBoss 
7 b  u7  medBoss  bigBoss 
+0

Вы должны быть более точными в разработке программного обеспечения, вы не должны говорить «пользователю», когда вы имеете в виду «пользователь, который является эм», например. Я думаю, что вы говорите: если в месте все роли - emp, то босс - medBoss для всех. Если в месте есть emp и smallBoss, но нет medBoss или bigBoss, тогда каждая emp имеет smallBoss в колонке босса, а smallBoss имеет bigBoss. Если есть emp, smallBoss и medBoss, тогда ... (как вы показываете для b). Вопросы: возможно ли иметь место с нулевым emp, просто боссы? И если да, то каковы правила? – mathguy

+0

Я отредактировал свой вопрос с небольшим количеством информации об этом, но вы уже помогли мне с ответом. Я смогу адаптировать этот запрос к моим потребностям, поскольку у меня более сложная ситуация. Большое спасибо! :) – mystic007

ответ

0

Вы должны ни объединения, ни профсоюзы; вам нужны аналитические функции и выражения case. (В этом решении аналитическо max().)

Как показано ниже, было бы намного проще, если бы вы использовали систему кодирования для «ролей» - 0 для сотрудника, 1 для smallBoss и т. Д. нам нужно создать его «на лету» в запросе.

USER and ROLE зарезервированные слова в Oracle, они не должны использоваться в качестве имен столбцов (даже если они не являются заменой для размещения здесь, если они не являются вашими фактическими именами столбцов); Я заменил их USR и RL.

Предполагалось, что существует только четыре возможности со следующими правилами. Если мое предположение неверно, вы должны иметь возможность адаптировать запрос к вашим фактическим возможностям и правилам; вы должны уметь легко видеть, как каждая возможность и правила отражаются в запросе.

Если в месте есть только emp, у всех у них есть medBoss для босса.

Если есть только emp и smallBoss, тогда у emp есть smallBoss как босс, а у smallBoss есть bigBoss.

Если есть emp, smallBoss и medBoss, то smallBoss является боссом emp, medBoss является боссом smallBoss, а bigBoss - боссом medBoss.

Если есть эми, smallBoss, medBoss и BigBoss, то правила не как в последнем абзаце, и BigBoss имеет не босс (null) - это наиболее распространенный способ представления, что в иерархической таблице.

with 
    test_data (id, place, usr, rl) as (
     select 1, 'a', 'u1', 'emp'  from dual union all  
     select 2, 'a', 'u2', 'emp'  from dual union all   
     select 3, 'a', 'u3', 'smallBoss' from dual union all 
     select 4, 'b', 'u4', 'emp'  from dual union all 
     select 5, 'b', 'u5', 'emp'  from dual union all 
     select 6, 'b', 'u6', 'smallBoss' from dual union all 
     select 7, 'b', 'u7', 'medBoss' from dual 
    ) 
-- End of test data (not part of the query). The SQL query begins BELOW THIS LINE. 
select id, place, usr, rl, 
     case max(rl_code) over (partition by place) 
         when 0 then 'medBoss' 
         when 1 then case rl_code when 0 then 'smallBoss' 
                when 1 then 'bigBoss' end 
         when 2 then case rl_code when 0 then 'smallBoss' 
                when 1 then 'medBoss' 
                when 2 then 'bigBoss' end 
         when 3 then case rl_code when 0 then 'smallBoss' 
                when 1 then 'medBoss' 
                when 2 then 'bigBoss' end 
         end as boss 
from (           
     select id, place, usr, rl, 
        case rl when 'emp'  then 0 
          when 'smallBoss' then 1 
          when 'medBoss' then 2 
          when 'bigBoss' then 3 end as rl_code 
     from  test_data 
     ) 
order by place, id -- if needed 
; 

Выход:

ID PLACE USR RL  BOSS 
-- ----- --- --------- ---------- 
1 a  u1 emp  smallBoss 
2 a  u2 emp  smallBoss 
3 a  u3 smallBoss bigBoss 
4 b  u4 emp  smallBoss 
5 b  u5 emp  smallBoss 
6 b  u6 smallBoss medBoss 
7 b  u7 medBoss bigBoss 

7 rows selected. 
+0

Это все, что мне нужно, отлично! В каждом месте есть босс, и если в каком-либо месте присутствует более одного босса, например, «b»: 'smallBoss' имеет приоритет 1,' medBoss' имеет приоритет 2, а 'bigBoss' является последней опцией и не должен быть «обеспокоенным» для сотрудников низкого уровня. – mystic007