【问题标题】:SQL (MS-Access) - LEFT JOIN to show records in left table not in right tableSQL (MS-Access) - LEFT JOIN 显示左表中的记录而不是右表中的记录
【发布时间】:2017-07-28 02:36:19
【问题描述】:

我有 2 个表:A 有 400000 条记录,B 大约有 350000 条记录。

我正在执行 LEFT JOIN 以显示两个表之间的差异,但查询返回大约 100000。

这是我的 Not-In 查询:

SELECT *
FROM TableA LEFT JOIN TableB
ON TableA.[ID] = TableB.[ID]
WHERE (TableB.[ID] is null)

是否有问题,或者查询返回的结果是否可能超过表之间的差异?谢谢

【问题讨论】:

  • 返回结果大于两表记录数之差是很正常的。不仅B 中可能有不在A 中的记录,而且A 也可能有B 没有的记录。如果您认为这是不正确的,您应该仔细查看您的数据。正如所写,您的查询看起来不错。
  • 您确定所有来自 B 的记录都存在于 A 中吗?
  • 我通常在两个表之间做一个联合来检查两个方向的匹配。
  • @Siyual 我使用 RIGHT JOIN 检查了另一个方向,结果显示 TableB 中没有不在 TableA 中的记录。在我看来,这个 LEFT JOIN 显示的结果比表之间的差异更多。我试图弄清楚是否还有其他原因,但我仍然不完全理解。
  • @warty 这听起来像是一个愚蠢的问题,但是您的 RIGHT JOIN 是什么样的?特别是当你被难住时,如果这是你努力的一部分,那么你也应该展示它(不仅仅是在 cmets 中陈述它)......即使它看起来微不足道。并且不要只是在这里输入,而是重新运行您发布的内容。最后,如果您的 RIGHT JOIN 语句确实如您所说的那样有效,那么 TableB 的 duplicate ID 值都与 TableA.ID 值匹配。从数字 TableB 中至少有 50,000 个重复的 ID 值。如果 ID 是唯一的主键,那就没有意义了。

标签: sql ms-access


【解决方案1】:

您的查询显示表 A 中与表 B 中不匹配的行。如果您想要差异,您还需要表 B 中不存在于表 A 中的行。您可以使用联合来做到这一点

SELECT *
   FROM TableA 
   LEFT JOIN TableB ON TableA.[ID] = TableB.[ID]
   WHERE (TableB.[ID] is null)
Union All
SELECT *
   FROM TableB 
   LEFT JOIN TableA ON TableB.[ID] = TableA.[ID]
   WHERE (TableA.[ID] is null)

编辑:这假定类似的表结构。您可能需要在 select 子句中使用列名而不是 *。

【讨论】:

    【解决方案2】:

    除了差异之外,您可能会从 TableB 中提取一些 ID 确实为 null 的行,因为相等性不适用于 null 值。

    因此,正如另一个答案中所述,正确的方法是将 NULL 条件设置为 ON 子句的一部分,而不是 WHERE

    【讨论】:

    • Null 条件打算出现在Where 子句中,因为他们只想选择未通过Outer Join 检查的记录。将它移到On 子句中不是解决方案(并且会导致零结果,因为A.Id = B.Id And B.Id Is Null 永远不会导致结果为真。)
    • Access 还限制了哪些字段和条件可以出现在 join ON 子句中——它会返回错误。
    • @Siyual : NULL 在 = 中产生不一致的结果,这就是含义不明确的原因
    • @CPerkins:你说得对,我错过了(MS Access)部分。
    猜你喜欢
    • 2023-02-10
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多