子查询适用于这种情况吗?

时间:2019-01-23 18:43:51

标签: sql-server

我有以下6张桌子

地区-包含地区ID和地区名称

District_access-用于标识用户有权访问哪些地区

operation_centers-包含运营中心ID和名称

ops_access-用于标识用户有权访问哪些ops中心

项目-包含项目ID和名称

project_access-用于识别用户有权访问哪些项目

我当前正在使用此查询,它返回用户可以访问的地区,运营中心和项目。问题是,如果用户只能访问第4区,那么我在编辑页面上将看不到其他任何区,而只能看到第4区以及第4区下的运营中心和项目。因此,我需要查看其他区可以为用户分配对其他地区,运营中心和项目等的访问权限,子查询可以帮助您吗?

   select district_access_id,district_user_nm,district_role,district_id,district_name,operation_center_id,operation_center_name,oc_district_id,project_name_id,project_name,project_oc_id
from district_access
left join districts ON district_access.district_access_id = districts.district_id
left join operation_centers ON districts.district_id = operation_centers.oc_district_id
left join projects ON operation_centers.operation_center_id = projects.project_oc_id
where district_user_nm = '#URL.user_id#' AND oc_district_id <> '' and project_oc_id <> '' OR district_user_nm = ''

谢谢, 史蒂夫

1 个答案:

答案 0 :(得分:1)

您的主表(FROM)应该是用户表,而不是分区访问。从您的用户到所有地区的交叉联接将为您提供该用户和所有地区的所有排列(或者您可以在诸如ON 1 = 1的任意语句上保留联接)。另外,由于该OR,您应该在WHERE中使用括号以确保逻辑定义明确。

select district_access_id,district_user_nm,district_role,district_id,district_name,operation_center_id,operation_center_name,oc_district_id,project_name_id,project_name,project_oc_id
from <USERNAME TABLE>
cross join districts
left join district_access ON district_access.district_access_id = districts.district_id
   and <USERNAME TABLE>.user_nm = '#URL.user_id#'
left join operation_centers ON districts.district_id = operation_centers.oc_district_id
left join projects ON operation_centers.operation_center_id = projects.project_oc_id
where <USERNAME TABLE>.user_nm = '#URL.user_id#'
    AND oc_district_id <> ''
    and project_oc_id <> ''
    OR district_user_nm = ''