在 MS Access 中两两查找三个字段中的重复项
Find duplicates in three fields two-by-two in MS Access
在 Access 2010 中,我想从一个 table 的 3 个字段中查找重复项,但要按字段对或两个字段两个字段查找。基本上,重复项要么有:
- 相同的姓氏和相同的出生日期
或者
- 相同的 名字 和相同的 出生日期
例如,我的 table 是:
Last name First name DoB
Brook Felicity 05/01/1970
Carlson Roxane 11/23/1983
Brook Felicity Joan 05/01/1970
Carlson Winfield Roxane 11/23/1983
Ackerman Randall 11/23/1983
查询结果应该会找到除最后一条(出生日期相同但姓名唯一)以外的所有记录。
我所做的是使用 Access 查询向导查找重复项,一步一步地为每一对创建一个查询。但是,当我创建第三个查询以获取所有结果时,table 需要永远加载(我的 table 有 3000 多条记录)。因此,前两个查询似乎根本没有帮助。
我还创建了一个查询来连接成对的字段,认为减少两个字段而不是三个字段的搜索会有所帮助,但我只遇到错误。
我想我不能依赖向导,我必须使用 SQL,但我不太习惯 table。
我该怎么办?
非常感谢!
此逻辑应该符合您的要求:
select t1.*, t2.*
from t as t1 inner join
t as t2
on t1.dateofbirth = t2.dateofbirth and
( (t1.lastname = t2.lastname and t1.firstname <> t2.firstname) or
(t1.firstname = t2.firstname and t1.lastname <> t2.lastname)
);
MS Access 对 on
子句中的内容有一些奇怪的规定。您可能需要将其写为:
select t1.*, t2.*
from t as t1 inner join
t as t2
on t1.dateofbirth = t2.dateofbirth
where ( (t1.lastname = t2.lastname and t1.firstname <> t2.firstname) or
(t1.firstname = t2.firstname and t1.lastname <> t2.lastname)
);
感谢 Gordon 的回答,我找到了一个解决方案来查询所有这些重复项:
- 相同的出生日期,相同的姓氏,相同的名字(没提,我的错)
- 出生日期相同,姓氏相同
- 出生日期相同,名字相同
我只是使用了我的 ID 字段,所以我猜这是需要的。
在这里 :(像我这样的傻瓜:你需要用你的 table 的名称替换 "tablename" 并使用足够的字段名称,仅此而已)
SELECT DISTINCT t1.*
FROM Tablename AS t1
INNER JOIN Tablename AS t2
ON t1.dateofbirth = t2.dateofbirth
WHERE t1.ID <> t2.ID
AND (t1.lastname = t2.lastname OR t1.firstname = t2.firstname);
起初我在 ON
子句中添加了 t1.ID <> t2.ID
和 AND
但 Gordon 是对的:Access 不喜欢这样,因此无法使用设计视图。
我不知道我是否应该使用 GROUP BY 和 HAVING 计数而不是自连接,我想这是可能的,但它按原样工作,所以...
再次感谢你,戈登!
在 Access 2010 中,我想从一个 table 的 3 个字段中查找重复项,但要按字段对或两个字段两个字段查找。基本上,重复项要么有:
- 相同的姓氏和相同的出生日期
或者
- 相同的 名字 和相同的 出生日期
例如,我的 table 是:
Last name First name DoB
Brook Felicity 05/01/1970
Carlson Roxane 11/23/1983
Brook Felicity Joan 05/01/1970
Carlson Winfield Roxane 11/23/1983
Ackerman Randall 11/23/1983
查询结果应该会找到除最后一条(出生日期相同但姓名唯一)以外的所有记录。
我所做的是使用 Access 查询向导查找重复项,一步一步地为每一对创建一个查询。但是,当我创建第三个查询以获取所有结果时,table 需要永远加载(我的 table 有 3000 多条记录)。因此,前两个查询似乎根本没有帮助。
我还创建了一个查询来连接成对的字段,认为减少两个字段而不是三个字段的搜索会有所帮助,但我只遇到错误。
我想我不能依赖向导,我必须使用 SQL,但我不太习惯 table。
我该怎么办?
非常感谢!
此逻辑应该符合您的要求:
select t1.*, t2.*
from t as t1 inner join
t as t2
on t1.dateofbirth = t2.dateofbirth and
( (t1.lastname = t2.lastname and t1.firstname <> t2.firstname) or
(t1.firstname = t2.firstname and t1.lastname <> t2.lastname)
);
MS Access 对 on
子句中的内容有一些奇怪的规定。您可能需要将其写为:
select t1.*, t2.*
from t as t1 inner join
t as t2
on t1.dateofbirth = t2.dateofbirth
where ( (t1.lastname = t2.lastname and t1.firstname <> t2.firstname) or
(t1.firstname = t2.firstname and t1.lastname <> t2.lastname)
);
感谢 Gordon 的回答,我找到了一个解决方案来查询所有这些重复项:
- 相同的出生日期,相同的姓氏,相同的名字(没提,我的错)
- 出生日期相同,姓氏相同
- 出生日期相同,名字相同
我只是使用了我的 ID 字段,所以我猜这是需要的。
在这里 :(像我这样的傻瓜:你需要用你的 table 的名称替换 "tablename" 并使用足够的字段名称,仅此而已)
SELECT DISTINCT t1.*
FROM Tablename AS t1
INNER JOIN Tablename AS t2
ON t1.dateofbirth = t2.dateofbirth
WHERE t1.ID <> t2.ID
AND (t1.lastname = t2.lastname OR t1.firstname = t2.firstname);
起初我在 ON
子句中添加了 t1.ID <> t2.ID
和 AND
但 Gordon 是对的:Access 不喜欢这样,因此无法使用设计视图。
我不知道我是否应该使用 GROUP BY 和 HAVING 计数而不是自连接,我想这是可能的,但它按原样工作,所以...
再次感谢你,戈登!