【问题标题】:Inner Join in Access Query not working访问查询中的内部加入不起作用
【发布时间】:2014-12-12 21:17:05
【问题描述】:

这里是数据库表

群组用户

GroupID   -  UserID
--------------------
00001     - user1
00002     - user1
00003     - user2

群组

GroupID   -  GroupName   -  Locked   - Deleted
---------------------------------------------
00001     - gruop1       -  True     - False
00002     - gruop2       -  False       - False
00003     - gruop3       -  False       - False    

我正在从 GroupsUsers 表中获取下面给出的查询中特定组的 UserId,但我还想检查 Groups 表中 where 子句中的组 ID 是 locked=true 还是 delete=true,那么它不应该在结果集。

这是我尝试过的方法

SELECT DISTINCT GU.UserId From 
GroupsUsers AS GU
 INNER JOIN Groups AS G
 ON GU.GroupID = G.GroupId
WHERE  (((G.GroupId)=00001)) AND (((G.Locked)=False)) OR (((G.Deleted)=False));

但是这个查询返回给我所有的用户

我只想获取未锁定或删除的特定组的用户

【问题讨论】:

  • 请发表您的有效结果
  • 您的查询不会产生任何结果。您的GroupId='00001' 正在选择不想想要选择的记录。

标签: sql ms-access inner-join


【解决方案1】:

如果您不想在其Locked 状态为真时返回特定组,并且您不想在其Deleted 状态为真时返回它,这意味着您希望在两者时返回它 值为False:

SELECT DISTINCT
  GU.UserId
FROM
  GroupsUsers AS GU
INNER JOIN
  Groups AS G ON GU.GroupID = G.GroupId
WHERE G.GroupId=00001
  AND G.Locked=False
  AND G.Deleted=False
;

【讨论】:

    【解决方案2】:

    您的查询是这样的:

    SELECT DISTINCT GU.UserId 
    From GroupsUsers AS GU INNER JOIN Groups AS G ON GU.GroupID = G.GroupId
    WHERE  (((G.GroupId)=00001)) AND (((G.Locked)=False)) OR (((G.Deleted)=False));
    

    这句话的意思是:“从 GroupsUsers 中选择用户 ID,其中组 ID 为 00001,并且已锁定或已删除均为假。

    但在您的问题中,您已经说过“检查 where 子句中的组 ID 是否在 Groups 表中是 locked=true 或 delete=true 那么它不应该在结果集中被选中。”

    因此,如果如果locked = true,或者如果deleted 为true,则不选择它,那么当您在查询中测试相反的状态时(即针对false 进行测试),您需要使用AND 而不是OR:

    SELECT DISTINCT GU.UserId 
    From GroupsUsers AS GU INNER JOIN Groups AS G ON GU.GroupID = G.GroupId
    WHERE  (((G.GroupId)=00001)) AND (((G.Locked)=False)) AND (((G.Deleted)=False));
    

    PS:Access 的查询生成器将大量括号放入 where 子句中,但在大多数情况下,它们不是必需的,如果去掉它们,查询会更容易阅读和理解。此外,如果您需要编写查询以与多种类型的后端数据库进行交互,则针对 0 而不是 false 进行测试会很有用:

    SELECT DISTINCT GU.UserId 
    From GroupsUsers AS GU INNER JOIN Groups AS G ON GU.GroupID = G.GroupId
    WHERE G.GroupId = 00001 AND G.Locked = 0 AND G.Deleted = 0
    

    【讨论】:

      【解决方案3】:

      您的查询未返回结果,因为您排除了 WHERE 子句中的其余记录。

      查看您的数据:对 GroupId = '0001' 进行过滤只会为我们提供两个表之间的第一条记录。没有WHERE 子句的结果集看起来像

        UserId  GroupId                            Locked  Delete
       ----------------     {Extended Result}    ----------------
        user1    0001                               Yes      No
      

      让我们在其中添加WHERE 子句:

      If a GroupId has "yes" for either Locked or Delete, don't select it"

      好吧,您选择的唯一行就到这里了。

      如果你去掉WHERE 子句中的GroupId,你会发现你(我认为?)正在寻找的结果。

      userId
      -------
      user1   <- This is the second user1 in the GroupsUser's table
      user2
      

      这会产生结果:

      SELECT DISTINCT GroupsUsers.userID,
      FROM GroupsUsers
       INNER JOIN Groups ON GroupsUsers .ID = Groups.ID
      WHERE (((Groups.Locked)=No)) OR (((Groups.Delete)=No));
      

      如果您想检查特定的 GroupId,并且您正在使用 this 查询:

      SELECT DISTINCT GU.UserId 
      From GroupsUsers AS GU 
      INNER JOIN Groups AS G 
      ON GU.GroupID = G.GroupId 
      WHERE (((G.Locked)=False)) 
          OR (((G.Deleted)=False)) AND (((G.GroupId)=00001));
      

      您仅根据所需条件的 75% 过滤结果。您的查询为您提供 UserId,其中 Locked 为 false 或 Deleted 为 false,而 GroupId = 00001。您需要将GroupId 条件应用于WHERE 子句的两个方面。

      WHERE (G.Locked = False AND G.GroupId = 0001) OR (G.Deleted = False AND G.GroupId = 00001)

      【讨论】:

      • 此解决方案有效,但我还想检查特定组 ID 的锁定和删除状态这是当前查询 SELECT DISTINCT GU.UserId From GroupsUsers AS GU INNER JOIN Groups AS G ON GU.GroupID = G.GroupId WHERE (((G.Locked)=False)) OR (((G.Deleted)=False)) AND (((G.GroupId)=00001));但它为我提供了未锁定或删除的组的所有用户...我只想检查 1 个组
      • 您的 GroupId 标准需要在 WHERE 子句中的两个条件中都存在...WHERE G.groupid = 00001 and g.locked = false OR g.groupid = 00001 AND G.deleted = false。
      【解决方案4】:

      尝试添加

      and Locked='no' and Delete='no'
      

      在查询结束时

      SELECT DISTINCT GU.UserId From 
      GroupsUsers AS GU
       INNER JOIN Groups AS G
       ON GU.GroupID = G.GroupId
       WHERE GroupId='00001' and Locked='no' and Delete='no'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-01
        • 2014-03-22
        • 1970-01-01
        • 2013-10-21
        • 1970-01-01
        相关资源
        最近更新 更多