1

我正在尝试生成有权访问特定位置的用户列表。在我看来,我的数据库中记录用户可以访问的位置的表是倒退的。它列出了用户无法访问的位置。我尝试not in了几种不同的方法,但没有任何运气。该查询只返回一个空白结果集。我试过在这里找到一些东西来帮助我并用谷歌搜索,但这没有帮助......我总是得到空白的结果屏幕(没有返回)。我认为问题在于每个相应位置USER_LOCATION_EXCLUSION都有几个条目。USER_ID我没有创建这个表结构,而是继承了它。

设想

Tables                  Columns
====================================================
APP_USER                USER_ID, USER_NAME    
LOCATION                LOCATION_ID, LOCATION_NAME    
USER_LOCATION_EXCLUSION USER_ID, LOCATION_ID

APP_USERLOCATION表都有唯一的 ID。这些ID既用于USER_LOCATION_EXCLUSION(列出用户无法访问的位置),也可以根据用户访问在此表中多次使用。我想制作具有USER_NAME并且LOCATION_NAME他们可以访问的报告。

4

2 回答 2

1

听起来您想要的是笛卡尔结果减去排除...即:对于每个用户,假设为他们提供每个位置访问权限,然后找出他们被排除在外的内容...

select
      PreQuery.User_ID,
      PreQuery.User_Name,
      PreQuery.Location_Name
   from
      ( select
               AU.User_ID,
               AU.User_Name,
               L.Location_ID,
               L.Location_Name
            from
               App_User AU,
               Location L ) PreQuery
         LEFT JOIN USER_LOCATION_EXCLUSION ULE
             on PreQuery.User_ID = ULE.User_ID
             AND PreQuery.LOCATION_ID = ULE.LOCATION_ID
       where
          ULE.Location_ID = NULL

通过对排除表执行 LEFT JOIN,每条记录都将尝试加入排除列表......因此,当它找到匹配项时,该位置 ID 将存在......当它不存在时,它将是null(满足您的 NOT Excluded from)

这也消除了为每个用户/位置测试的子选择 WHERE 子句

于 2012-11-13T16:51:27.380 回答
0

我会使用这样的东西。要获取位置用户的所有组合,您可以使用不带连接的 Select 查询:

Select *
From Location, App_User

但从这里您必须排除user_location_list表中包含的位置用户组合。这可以解决您的问题:

Select
  Location.*,
  App_User.*
From App_USer, Location
Where
  Not Exists (select * from user_location_exclusion
              where user_location_exclusion.user_id=app_user.user_id
              and user_location_exclusion.location_id=location.location_id)

这显示了尚未排除的每个用户的每个位置。

于 2012-11-13T16:45:17.597 回答