2017-04-24 58 views
1

我有一个表和当前在我的Access数据库中的查询。 该表是每个完成了一项工作(所有人都已完成)和他们已完成的工作的人。 我有一个查询已经搜索另一个表,找出这个表中的哪些人已经开始另一项工作(在另一个课程上活跃的人)。SQL /查询字符串不返回我知道存在的记录

现在我想再运行一个查询来提取已完成工作的人员的姓名,但是他们已经开始下一个课程,因此排除了查询中的姓名。

我已经放在一起查询,但它不返回任何记录,当我知道它应该。

SELECT 
    [All Folks Ever Finished].Level 
    ,[All Folks Ever Finished].Status 
    ,[All Folks Ever Finished].Fname 
    ,[All Folks Ever Finished].Sname 
    ,[All Folks Ever Finished].Email 
    ,[People who are active on another course].[All Folks Ever Active].Level 
FROM 
    [All Folks Ever Finished] 
INNER JOIN [People who are active on another course] 
    ON [All Folks Ever Finished].Email = [People who are active on another course].Email 
WHERE 
    NOT ([All Folks Ever Finished].Email) = ([People who are active on another course].Email); 

我知道2.5k中至少有1k条记录应该返回完成,但不会启动另一个过程。

回答

2

您的查询可以如下简化:

SELECT A.*, B.* 
FROM A INNER JOIN b 
ON A.Email = B.Email 
WHERE Not (A.Email) = (B.Email); 

这可以很容易地看到了问题:你是加盟的电子邮件,然后消除基于WHERE条款中相同字段的记录。这将永远给你相同的空集,即没有记录。

据我了解,你希望人们:

  1. 谁已经完成了一些工作,
  2. 谁没有进行另一场活跃。

有几种方法可以做到这一点。一个是通过使用外连接:

SELECT A.*. B.* 
FROM A LEFT OUTER JOIN B 
ON A.Email = B.Email 
WHERE B.Email is NULL 

这工作做的外连接,并只选择那些谁在已经完成的工作是空的已经完成的工作,其入境的人。

您也可以使用例如设置差异来做到这一点。 MINUS:

SELECT A.* 
FROM A 
MINUS 
SELECT A* 
FROM A INNER JOIN B 
ON A.Email = B.Email 
+0

比你非常喜欢这个。我将不得不对内部和外部连接的区别做更多的研究。 –

2

您的inner join条件与您的where子句相反,因此您不会得到任何行。如果你有不同的on子句,那么你可能会得到一些行。

要查找第一个查询/表中不在第二个查询/表中的人员,可以使用left join并返回第二个表为null的行。

SELECT 
    [All Folks Ever Finished].level 
, [All Folks Ever Finished].status 
, [All Folks Ever Finished].Fname 
, [All Folks Ever Finished].Sname 
, [All Folks Ever Finished].Email 
, [People who are active on another course].[All Folks Ever Active].level 
from [All Folks Ever Finished] 
    left join [People who are active on another course] 
    on [All Folks Ever Finished].Email = [People who are active on another course].Email 
where [People who are active on another course].Email is null; 
1

试试这个代码:

SELECT [All Folks Ever Finished].Level, [All Folks Ever Finished].Status, [All Folks Ever Finished].Fname, [All Folks Ever Finished].Sname, [All Folks Ever Finished].Email, [People who are active on another course].[All Folks Ever Active].Level 
FROM [All Folks Ever Finished] LEFT JOIN [People who are active on another course] ON [All Folks Ever Finished].Email = [People who are active on another course].Email 
WHERE ([People who are active on another course].Email is null);