0

我需要帮助!例如,有四个表:cars、users、departments 和 join_user_department。最后一个表用于 M: N 表用户和部门之间的关系,因为某些用户的访问权限有限。我需要获取用户可以访问的部门的汽车数量。表“cars”有一个列 department_id。如果表 join_user_department 没有 user_id 的任何记录,这意味着他可以访问所有部门,并且选择查询必须没有任何条件。我需要做这样的事情:

declare
DEP_NUM  number;--count of departments where user have access
 CARS_COUNT number;--count of cars
BEGIN
SELECT COUNT (*) into DEP_NUM from join_user_departments where user_id=?;
SELECT COUNT(*) into CARS_COUNT FROM cars where 
  IF(num!=0)—it meant that user access is limited
  THEN department_id IN (select dep_id from join_user_departments where user_id=?);
4

2 回答 2

2

用户要么可以访问所有汽车(我假设所有汽车都绑定到一个部门,并且用户可以访问所有部门),要么用户具有有限的访问权限。您可以使用 UNION ALL 将这两个组放在一起,并按用户分组进行最终计数。我已经交叉加入了可以无限制访问汽车表的用户,以将它们与所有汽车相关联:

(更新也计算部门)

select user_id, 
    count(distinct department_id) as dept_count, 
    count(distinct car_id) as car_count,
from (
    select ud.user_id, ud.department_id, c.car_id
    from user_departments ud
    join cars c on c.department_id = ud.department_id
    UNION ALL
    select u.user_id, v.department_id, v.car_id
    from user u
    cross join (
        select d.department_id, c.car_id
        from department d
        join cars c on c.department_id = d.department_id
    ) v
    where not exists (
        select 1 from user_departments ud 
        where ud.user_id = u.user_id
    )
)
group by user_id

UNION ALL 比 UNION 更有效;一个 UNION 查找属于这两个组的记录并丢弃重复项。由于每个用户都属于一个或另一个存储桶,因此 UNION ALL 应该可以解决问题(在外部查询中进行不同的计数也可以排除重复项)。

于 2012-04-09T22:45:36.863 回答
1

“如果表 join_user_department 没有 user_id 的任何记录,这意味着他可以访问所有部门”

这似乎是非常糟糕的做法。本质上,您正在使用记录的缺失来模拟记录的存在。很乱。如果用户无法从任何部门访问汽车,会发生什么情况?也许当前的业务逻辑不允许这样做,但是您有一个“数据模型”,它不允许在不更改应用程序逻辑的情况下实现这样的场景。

于 2012-04-09T23:03:15.573 回答