2017-07-27 72 views
0

我有2个表:A有400000条记录,B有350000条记录。SQL(MS-Access) - 左加入显示左表中的记录不在右表

我正在做一个左加入显示两个表之间的差异,但查询返回约100000。

这是我的不是,在查询:

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

有什么问题或是否有可能该查询返回比表之间的区别吗?谢谢

+1

这是非常正常的,因为返回的结果比两个表之间的记录计数差异大。不仅在'B'中有不在'A'中的记录,而且'A'也可能有'B'没有的记录。如果您认为这是不正确的,您应该仔细查看您的数据。正如所写的,你的查询看起来很好。 – Siyual

+0

你确定你所有的记录都来自B吗? –

+0

我通常在两个表格之间进行联合检查两个方向上的匹配。 –

回答

-2

除了区别之外,您可能会从TableB中拉出一些行,其中ID真的为空,因为相等性不适用于空值。

所以正确的方法,如对方回答说,是设置NULL条件为ON子句的一部分,而不是WHERE

+1

'Null'条件*意图*在'Where'子句中,因为它们只想选择'外部连接'检查失败的记录。将它移到'On'子句中*不是解决方案(并且会导致零结果,因为'A.Id = B.Id和B.Id是Null'永远不会导致真实。) – Siyual

+0

访问还限制了什么字段和条件可以出现在join ON子句中 - 它会返回一个错误。 –

+0

@Siyual:NULL在=时产生不一致的结果,这就是为什么含义不明确 –

1

您的查询显示,从表格中的行没有在表中的比赛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子句中使用列名而不是*。