在oracle中选择“使用if查询”

在oracle中选择“使用if查询”,oracle,if-statement,Oracle,If Statement,我需要帮助!例如,有四个表:cars、users、departments和join\u user\u department。最后一个表用于表用户和部门之间的M:N关系,因为某些用户的访问权限有限。我需要得到用户可以访问的部门的车辆数量。表“cars”有一个列department\u id。如果表join\u user\u department没有任何记录by user\u id,这意味着他可以访问所有部门,select query必须不带任何条件。我需要这样做: declare DEP_NUM

我需要帮助!例如,有四个表:cars、users、departments和join\u user\u department。最后一个表用于表用户和部门之间的M:N关系,因为某些用户的访问权限有限。我需要得到用户可以访问的部门的车辆数量。表“cars”有一个列department\u id。如果表join\u user\u department没有任何记录by user\u id,这意味着他可以访问所有部门,select query必须不带任何条件。我需要这样做:

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=?);

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

(更新后还包括了部门)


一个工会比一个工会更有效率;工会寻找属于这两个组的记录,并丢弃重复的记录。由于每个用户都落入一个或另一个桶中,UNION ALL应该做到这一点(在外部查询中进行不同的计数也可以排除重复)。

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

(更新后还包括了部门)

一个工会比一个工会更有效率;工会寻找属于这两个组的记录,并丢弃重复的记录。由于每个用户都落入一个或另一个存储桶中,UNIONALL应该做到这一点(在外部查询中进行不同的计数也可以排除重复)

“如果表join\u user\u部门没有任何用户id记录 这意味着他可以访问所有部门”

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

“如果表join\u user\u部门没有任何用户id记录 这意味着他可以访问所有部门”


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

这一点很好。数据库中应该有一个明确授予用户完全访问权限的标志。这一点很好。数据库中应该有一个明确授予用户完全访问权限的标志。
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