Однострочный подзапрос Oracle возвращает более одной ошибки строки - PullRequest
0 голосов
/ 30 сентября 2011

У меня есть сценарий. Можно ли это сделать с помощью одного запроса?

  • Таблица Company: Информация об одной компании с CPK в качестве первичного ключа и одним менеджером, ведущим, HR, прикрепленным к нему

  • Таблица «Сотрудники»: для каждой компании есть сотрудники (1 или более может быть до 500) с уникальным empID и менеджером, руководителем, персоналом, прикрепленным к нему

  • Таблица Информация о сотрудниках (для использования веб-приложения): ему назначается 1 или более Manager, Lead, HR (или может быть ALL, ALL, ALL, что означает, что он может видеть все)

Итак:

Company
--------
CPK (PK)
Manager
Lead
HR

Employees 
--------
empID (PK)
CPK (FK)
Manager
Lead
HR

EmployeesInfo
-------------
USER_ID (FK)
Manager
Lead
HR

Web -> Когда пользователь входит в систему, он должен получить всю информацию о компании. Если у него есть доступ к этой компании или любому сотруднику в этой компании, то эта строка включается, если она неактивна (отключена), если "Все", то он можно редактировать каждую запись

Например: Пользователь1 назначен на Manager1, Lead1 и HR1.
Затем он может редактировать все записи из компании, где менеджер = менеджер1, лидерство = лидерство1 и HR = HR1.
Также записи в компании, в которой есть сотрудники с Company.CPK = Employee.CPK и Employee.Manager = Manager1 и Employee.Lead = Lead1 и Employee.HR = HR1

Мой запрос до сих пор, но

select t2.MANAGER from Employees t2 where t2.CPK  = t1.CPK

возвращает несколько записей, что ожидается, что я должен делать ???

SELECT  t1.*,
      --All condition
      CASE WHEN (SELECT MANAGER FROM EmployeesInfo WHERE USER_ID=44) = 'All' then 1
           ELSE(
                --Check for Company
                CASE 
                WHEN t1.MANAGER  in (SELECT MANAGER FROM EmployeesInfo WHERE USER_ID=44) then 1
                WHEN t1.LEAD in (SELECT LEAD FROM EmployeesInfo WHERE USER_ID=44) then 1
                WHEN t1.HR  in (SELECT HR FROM EmployeesInfo WHERE USER_ID=44) then 1
           ELSE(
                --Check Employee M,L,HR for that Company 
                CASE
                WHEN (SELECT t2.MANAGER FROM Employees t2 WHERE t2.CPK  = t1.CPK) in 
                       (SELECT MANAGER FROM EmployeesInfo WHERE USER_ID=44) then 1
                WHEN (SELECT t2.LEAD FROM Employees t2 WHERE t2.CPK = t1.CPK ) in 
                       (SELECT LEAD FROM EmployeesInfo WHERE USER_ID=44) then 1
                WHEN (SELECT t2.HR FROM Employees t2 WHERE t2.CPK  = t1.CPK  ) in 
                       (SELECT HR FROM EmployeesInfo WHERE USER_ID=44) then 1
                ELSE 0 END
                )
           END
           )
      END AS Grey_Out 
FROM Company t1 
WHERE  t1.CPK  ='1234'

Наконец, я должен получить все Company с полем grey_out как (1 или 0), затем я буду использовать поле Grey_Out для определения, нужно ли сделать его редактируемым.

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

У меня разболелась голова, чтобы понять дизайн вашего стола.

Вы слышали о соединениях?

SELECT DISTINCT c.*, 
       CASE WHEN e.empid IS NOT NULL OR ei.USER_ID IS NOT NULL
            THEN 1
            ELSE 0
       END AS Grey_Out 
FROM Company c
    LEFT OUTER JOIN EmployeesInfo ei
        ON c.MANAGER = ei.MANAGER 
        OR c.LEAD = ei.LEAD
        OR c.HR = ei.HR
    LEFT OUTER JOIN Employees e
        ON e.CPK = c.CPK
        AND (
               e.MANAGER = ei.MANAGER
            OR e.LEAD = ei.LEAD
            OR e.HR = ei.HR
        )
WHERE c.CPK = '1234'
AND ei.USER_ID = 44
0 голосов
/ 30 сентября 2011

Изменение

case
    when (select t2.MANAGER from Table2 t2 where t2.CPK  = t1.CPK) in 
      (Select MANAGER from Table3 where USER_ID=44) then 1

до

case
    when exists
        (select *
        from 
            Table3 t3
            inner join table2 t2 on t2.manager = t3.manager
        where 
            t3.USER_ID=44 and t2.CPK = t1.CPK) then 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...