【问题标题】:MS Access SQL Query Not ExistMS Access SQL 查询不存在
【发布时间】:2020-05-28 07:51:18
【问题描述】:

我一直在试图弄清楚如何返回一个表中而不是另一个表中的数据。我认为外部连接会起作用,但似乎 Access 不允许这样做。

如果 MonthlyTargets_0_SPARTN_qry 中存在记录,我的 SQL 将返回结果,但如果没有记录,则不会返回任何数据。如果没有记录,我想显示一个 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 月没有记录,我需要它在 Actuals 中重新返回 0 谢谢

【问题讨论】:

标签: sql ms-access not-exists


【解决方案1】:

如果无论您的相邻数据如何,您的“ComplianceMonth”值始终存在(意思是如果为您的 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 没有合并功能。查询仍然没有返回空值。
  • CategoryID & TestID 不变,合规月份可以为空。
  • 19 个类别(存储桶)和填充存储桶的 TestID。例如:类别 1 有 testid 1,2,3 类别 2 testid 4,5,6。已完成的测试在 MonthlyTargets_0_SPARTN_qry 中。 MonthlyTargets_0_SPARTN_qry 包含测试编号、完成测试的人员 (TestOfficerID)、输入测试的日期 (ComplianceMonth)。试图获取每个测试人员每月进入每个类别的数量。
  • 我需要在 2020 年 2 月 1 日查看类别 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
  • 使用“右外连接”或“右连接”而不是内连接。
【解决方案2】:

MS-Access 允许在其 SQL 中进行外部连接。您可以同时执行 LEFT JOIN 或 RIGHT JOIN。

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

  1. 您在两个输入记录列表之间执行“LEFT JOIN”(包含在 Select 操作中)。如果两个输入记录列表之一具有一个(或多个)肯定不能为 Null 的字段,那将是左侧输入记录列表。 “ON”布尔表达式是您想要用于完全外连接的表达式。
  2. 如果左侧记录列表有一个(或多个)字段肯定不能为 Null,则跳过此步骤。否则,您在左侧记录列表和只有一条记录和一个非 Null 字段的记录列表之间进行交叉连接(在上面的示例中,它可以与 Select over “T_Numbers” 完全相同,以绿色突出显示) . Cross-Join 包含在 Select 中,该 Select 公开了 Cross-Join 操作中的所有字段,包括来自“T_Numbers”的字段“Num”(如果需要,可以使用另一个字段名称)。
  3. 您执行“RIGHT JOIN”,从点 1 具有相同的右输入记录列表。它的左记录列表是从点 2 选择的,或者是从点 1 的左输入记录列表,如对应(参见第 2 点)。 “ON”表达式必须与第 1 点中的“LEFT JOIN”表达式完全相同。
  4. 来自点 3 的“RIGHT JOIN”包含在一个 Select 中,该 Select 公开了来自点 1 的左右输入记录列表中的所有字段。该 Select 具有“WHERE”表达式“IsNull(field)”,其中“字段”是第 2 点中的“Num”字段,或者是左侧输入记录列表中肯定不能为 Null 的字段,如对应(参见第 2 点)。
  5. 您执行“UNION ALL”,其中 Select 包含第 1 点的“RIGHT JOIN”,而 Select 包含第 4 点的“RIGHT JOIN”。

更多信息请访问LightningGuide.net

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多