在oracle中选择“使用if查询”
我需要帮助!例如,有四个表: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必须不带任何条件。我需要这样做:在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
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