2017-04-24 17 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);