Sql Access查询中的内部联接不工作

Sql Access查询中的内部联接不工作,sql,ms-access,inner-join,Sql,Ms Access,Inner Join,这里是数据库表 石斑鱼 团体 我正在从GroupsUsers表中获取下面给出的查询中特定组的用户ID,但我还想检查where子句中的组ID在Groups表中是否为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)=

这里是数据库表

石斑鱼

团体

我正在从GroupsUsers表中获取下面给出的查询中特定组的用户ID,但我还想检查where子句中的组ID在Groups表中是否为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));
但是这个查询返回我所有的用户

如果某个组未被锁定或删除,我只想获取该组的用户,请尝试添加

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'

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

查看您的数据:在GroupId='0001'上进行筛选只会给出两个表之间的第一条记录。没有WHERE子句的结果集如下所示

  UserId  GroupId                            Locked  Delete
 ----------------     {Extended Result}    ----------------
  user1    0001                               Yes      No
让我们在其中添加WHERE子句:

如果GroupId对“锁定”或“删除”具有“是”,则不要选择它

你只选了一行

如果你在WHERE子句中去掉GroupId,你会找到你想要的结果?寻找

userId
-------
user1   <- This is the second user1 in the GroupsUser's table
user2
如果要检查特定的GroupId,并且正在使用此查询:

您只根据75%的条件筛选结果。当GroupId=00001时,查询将为您提供用户标识,其中Locked为false或Deleted为false。您需要将GroupId条件应用于WHERE子句的两个方面

其中G.Locked=False,G.GroupId=0001
或者G.Deleted=False和G.GroupId=00001

您的查询如下:

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中选择UserID,其中组id为00001,并且锁定或删除为false

但在您的问题中,您说过要检查where子句中的group 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

如果不希望在锁定状态为true时返回特定组,并且不希望在删除状态为true时返回该组,则表示在两个值均为False时返回该组:


请发布您的预期和有效结果。您的查询将不会产生任何结果。您的GroupId='00001'正在选择您不想选择的唯一记录。此解决方案有效,但我还想检查特定组ID的锁定和删除状态此处是当前查询选择DISTINCT GU.UserId From GroupsUsers作为GU内部加入组作为G ON GU.GroupId=G.GroupId,其中G.locked=False或G.deleted=False和G.GroupId=00001;但它给了我所有未锁定或删除的组的用户…我只想检查1个组您的组ID标准需要在WHERE子句中的两个条件下…其中G.GroupId=00001和G.locked=false或G.GroupId=00001和G.deleted=false。
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));
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));
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));
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
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
;