【问题标题】:Oracle Single-row subquery returns more than one row errorOracle 单行子查询返回多行错误
【发布时间】:2011-09-30 11:55:26
【问题描述】:

我有一个场景。这可以使用一个查询来完成吗?

  • 表公司:单一公司信息,以 CPK 作为主键,并附有一个 Manager、Lead、HR

  • 员工表:对于每家公司,都有员工(1 人或更多人最多可达 500 人)具有唯一的 empID 和附加的经理、主管、人力资源

  • 表员工信息(用于使用 Web 应用程序):为他分配了 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 --> 当用户登录时,他应该获取所有公司信息。如果他有权访问该公司或该公司内的任何员工,则启用该行,否则如果其为“全部”,则该行显示为灰色(禁用),然后他可以编辑每条记录

例如: 将 User1 分配给 Manager1、Lead1 和 HR1。
然后他可以编辑公司中经理 = Manager1、Lead = Lead1 和 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'

最后我应该得到所有带有 gray_out 字段为 (1 或 0) 的公司,然后我将使用 Grey_Out 字段来查找是否应该使其可编辑。

【问题讨论】:

    标签: sql oracle oracle11g case


    【解决方案1】:

    我只是为了理解你的桌子设计而头疼。

    您听说过联接吗?

    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
    

    【讨论】:

    • 感谢 Scorpi0。但它返回了 0 条记录。顺便说一句,我们无法更改由第 3 方供应商设计和运行的表格设计。所以我们可以照原样使用。我听说过加入并使用过它
    【解决方案2】:

    改变

    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
    

    【讨论】:

    • 感谢 Golez Trol 的帮助
    猜你喜欢
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多