在oracle中使用if选择查询

时间:2012-04-09 21:31:12

标签: oracle if-statement

我需要帮助!例如,有四个表:汽车,用户,部门和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=?);

2 个答案:

答案 0 :(得分: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应该执行这一操作(在外部查询中执行不同的计数也可以排除重复)。

答案 1 :(得分:1)

  

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

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