访问 SQL 查询以比较两个表并列出所有数据,而不仅仅是那些不匹配的数据

Access SQL query to compare two tables and list all data, not just those that dont match

我正在尝试创建一个可填写的表格,让我们的员工每天进行自我评估。我似乎有表格和 table 数据正常工作。我已将数据库拆分为表单的前端和数据的后端,以便我可以将表单分发给每个用户 PC 并使用访问运行时。我有 2 tables。一个 table Employee Info 将包含字段 Employee NameEmployee Number,这个 table 将包含组织内的所有员工。第二个 table“评估”包含输入到表单中的数据,字段为:Employee NameEmployee NumberSelf Assessed,带有 yes/no 复选框和Date Signed。当他们点击表单上的提交按钮时,签名日期字段会自动生成日期。我在编写一个查询时遇到了问题,该查询列出了员工信息 table 中的每个员工姓名和员工编号以及评估签署日期,即使他们当天没有使用表格也是如此。所以基本上,如果有人没有在该日期进行自我评估,它会在“签署日期”字段中显示空白。我只能让它显示那些在那个日期提交了条目的人,而不是显示所有其他没有提交的人。

我有这个,但它没有显示那些在那些日期没有提交的人:

SELECT [Employee Info].ID, [Employee Info].[Employee Name], [Employee Info].[Employee Number], Assessment.[Date Signed]
FROM [Employee Info] LEFT JOIN Assessment ON [Employee Info].[Employee Name] = Assessment.[Employee Name]
WHERE (((Assessment.[Date Signed])>=[Start Date] And (Assessment.[Date Signed])<=[End Date]))
ORDER BY Assessment.[Date Signed];

希望我解释正确。多年后,我正在尝试重新使用 MS Access。

仅显示未在特定日期评估的人的查询如下:

SELECT * FROM Employees WHERE EmpID NOT IN (SELECT EmpID FROM Assessment WHERE DateSigned = [enter date here];

或 'find unmatched' 查询(Access 有一个向导):

SELECT * FROM Employees LEFT JOIN Assessment ON Employees.EmpID = Assessment.EmpID_FK WHERE Assessment.EmpID_FK Is Null AND DateSigned = [enter date here];

[在此处输入日期] 可以引用表单上的控件来输入参数。

WHERE DateSigned = Forms!FormName!textboxname

使用上面的 UNION 查询可以显示所有员工:

SELECT EmpID, DateSigned FROM Assessments WHERE DateSigned = [enter date here]
UNION SELECT EmpID, DateSigned FROM Employees LEFT JOIN Assessment ON Employees.EmpID = Assessment.EmpID_FK
      WHERE Assessment.EmpID_FK Is Null AND DateSigned = [enter date here];

该查询中的数据不会被编辑table。

要查看每个员工每个日期的记录并能够编辑数据,则记录必须存在于评估 table 中。 “批量”创建记录可以通过 INSERT SELECT 操作 SQL.
完成 INSERT INTO Assessments(EmpID_fk, DateSigned) SELECT EmpID, #a date value here# FROM Employees;
现在员工可以在完成评估时修改复选框字段。

也许应该有两个日期字段:AssessmentDate、SignedDate。 SignedDate 将不仅仅是简单的复选框。然后 INSERT 操作将使用 AssessmentDate.

我认为问题在于您没有检查 WHERE 表达式中的空值。 A Null 因此 returns Null,这被认为是不匹配的。我建议你试试下面的代码:

SELECT [Employee Info].ID, [Employee Info].[Employee Name], [Employee Info].[Employee Number], Assessment.[Date Signed]
FROM 
    [Employee Info] 
LEFT JOIN 
    Assessment 
ON [Employee Info].[Employee Name] = Assessment.[Employee Name]
WHERE IsNull([Date Signed]) OR (((Assessment.[Date Signed])>=[Start Date] And (Assessment.[Date Signed])<=[End Date]))
ORDER BY Assessment.[Date Signed];

除此之外,我同意其他人发表的一些评论,即您应该在执行 LEFT JOIN 之前应用 WHERE 条件。也就是说,您首先在 table 上执行 SELECT,然后将 JOIN 应用于此 SELECT:这样效率更高,也是更好的 SQL 编程实践。 LightningGuide.net

中的更多信息