MS Access SQL查询不存在。

3

我一直在尝试想要返回一个表中有但另一个表里没有的数据,但是我尝试使用外连接时发现Access不支持。我的SQL语句只有在MonthlyTargets_0_SPARTN_qry表中存在记录时才能返回结果,如果没有记录则没有数据被返回。我想在没有记录时显示0。我的SQL语句如下:

SELECT REF_TestCategory_tbl.CategoryID
    ,MonthlyTargets_0_SPARTN_qry.[Supervisor Id] AS TestOfficerID
    ,Count(MonthlyTargets_0_SPARTN_qry.[Sheet ID]) AS Actuals
    ,MonthlyTargets_0_SPARTN_qry.ComplianceMonth
FROM MonthlyTargets_0_SPARTN_qry
INNER JOIN (
    REF_TestCategory_tbl INNER JOIN REF_TestCatalog_tbl ON REF_TestCategory_tbl.CategoryID = REF_TestCatalog_tbl.TestCategory
    ) ON MonthlyTargets_0_SPARTN_qry.[Test Number] = REF_TestCatalog_tbl.TestID
GROUP BY REF_TestCategory_tbl.CategoryID
    ,MonthlyTargets_0_SPARTN_qry.[Supervisor Id]
    ,MonthlyTargets_0_SPARTN_qry.ComplianceMonth
ORDER BY REF_TestCategory_tbl.CategoryID;

这将返回:

CategoryID  TestOfficerID   Actuals     ComplianceMonth
    1           3062            26      1/1/2020
    1           3062            6       2/1/2020
    2           3062            2       1/1/2020
    3           3062            2       1/1/2020
    3           3062            1       2/1/2020

如果2月没有记录,则需要在实际值中返回0。谢谢。

1
这个回答解决了你的问题吗?如何在Access中编写全外连接查询 - Igor
你可以这样做,然后检查表的主键列是否为NULL。 - Igor
或者您可以使用where not exists,这也能起作用。 - Igor
那个 SQL 会是什么样子? - Tom
https://stackoverflow.com/q/52506803/1260204 - Igor
我不确定如何做到这一点,因为我的连接和分组。 MonthlyTargets_0_SPARTN_qry INNER JOIN(REF_TestCategory_tbl INNER JOIN REF_TestCatalog_tbl ON REF_TestCategory_tbl.CategoryID = REF_TestCatalog_tbl.TestCategory)ON MonthlyTargets_0_SPARTN_qry。[测试编号] = REF_TestCatalog_tbl.TestID 按REF_TestCategory_tbl.CategoryID,MonthlyTargets_0_SPARTN_qry.[监督员ID],MonthlyTargets_0_SPARTN_qry.合规月份分组 按REF_TestCategory_tbl.CategoryID排序; - Tom
2个回答

0

MS-Access允许在其SQL中使用外连接。您可以执行LEFT JOIN或RIGHT JOIN。

MS-Access不包括完全外部连接的语句。但是,如果您想要执行完全外部连接,可以使用特定LEFT JOIN和特定RIGHT JOIN的UNION ALL来实现。执行完全外部连接的说明如下:

  1. 在两个输入记录列表之间执行“LEFT JOIN”(包含在Select操作中)。如果两个输入记录列表中的一个有一个或多个字段肯定不为空,那么它将成为左输入记录列表。 “ON”布尔表达式是您想要的全外连接。
  2. 如果左记录列表中有一个或多个字段肯定不为空,则跳过此步骤。否则,在左记录列表和具有仅具有一个非空字段的记录列表(可以与上面示例中高亮显示的“T_Numbers”上的相同Select)之间进行交叉连接。交叉连接包含在Select中,公开来自交叉连接操作的所有字段,包括来自“T_Numbers”的字段“Num”(如果需要,使用其他字段名)。
  3. 使用与点1中的“LEFT JOIN”相同的右侧输入记录列表执行“RIGHT JOIN”。其左记录列表是点2中的Select或点1中的左侧输入记录列表,视情况而定(请参见点2)。 “ON”表达式必须与点1中的“LEFT JOIN”的表达式完全相同。
  4. 来自点3的“RIGHT JOIN”包含在一个Select中,该Select公开点1中的左侧和右侧输入记录列表中的所有字段。此Select具有“WHERE”表达式“IsNull(field)”,其中“field”是点2中的“Num”字段或左侧输入记录列表中肯定为空的字段,视情况而定(请参见点2)。
  5. 使用包含来自点一的“RIGHT JOIN”的Select和包含来自点4的“RIGHT JOIN”的Select的“UNION ALL”。

更多信息请访问LightningGuide.net


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

0
如果您的“ComplianceMonth”值始终存在,而不受相邻数据的影响(即如果返回的相邻数据为NULL),则可以执行以下操作。
    SELECT REF_TestCategory_tbl.CategoryID, 
       MonthlyTargets_0_SPARTN_qry.[Supervisor Id] AS TestOfficerID, 
       coalesce(Count(MonthlyTargets_0_SPARTN_qry.[Sheet ID]),0) AS Actuals,
       MonthlyTargets_0_SPARTN_qry.ComplianceMonth
FROM            dbo.MonthlyTargets_0_SPARTN_qry RIGHT OUTER JOIN
                         dbo.REF_TestCategory_tbl RIGHT OUTER JOIN
                         dbo.REF_TestCatalog_tbl ON REF_TestCategory_tbl.CategoryID = REF_TestCatalog_tbl.TestCategory ON MonthlyTargets_0_SPARTN_qry.[Test Number] = REF_TestCatalog_tbl.TestID
GROUP BY REF_TestCategory_tbl.CategoryID, MonthlyTargets_0_SPARTN_qry.[Supervisor Id], MonthlyTargets_0_SPARTN_qry.ComplianceMonth
ORDER BY REF_TestCategory_tbl.CategoryID

希望这可以帮到你。

我将coalesce(Count(MonthlyTargets_0_SPARTN_qry.[Sheet ID]),0) AS Actuals更改为NZ(Count(MonthlyTargets_0_SPARTN_qry.[Sheet ID]),0) AS Actuals,因为Access没有coalesce函数。但是查询仍然没有返回空值。 - Tom
CategoryID和TestID是常量,符合性月份可以为空。 - Tom
19个类别(桶)和填充桶的TestID。例如:类别1有测试ID 1,2,3,类别2有测试ID 4,5,6。已完成的测试位于MonthlyTargets_0_SPARTN_qry中。MonthlyTargets_0_SPARTN_qry包含测试编号、完成测试的人员(TestOfficerID)、进入测试的日期(ComplianceMonth)。试图获得每个测试官员每月输入的每个类别的数量。 - Tom
我需要在2020年02月01日看到类别2的计数为0: CatID TestOfficerID Actuals ComplianceMonth 1 3062 2 1/1 1 3062 6 2/1 2 3062 2 1/1 2 3062 0 2/1 3 3062 2 1/1 3 3062 1 2/1 - Tom
请使用“右外连接”或“右连接”代替内连接。 - Heinrich
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接