使用MS Access 2010,我有两个表,我希望通过比较相似的字段(1:1和1:M)在其中一个表中找到匹配的记录。
表1,[760Vadim]有四个字段:Folio,PID Number1,PID Number2,PID Number3
表2,[no_dupes]有两个字段:Folio,PID
我需要找到[760Vadim]中与[no_dupes]中相似字段具有匹配值的所有记录。
比较Folio字段是1:1连接,而比较PID是1:M(1:3),它们都需要同时进行比较!
我已尝试使用Join和以下SQL语句:
1。)有效,但一次只能用于一个领域!
SELECT [760Vadim].*, no_dupes.PID
FROM no_dupes INNER JOIN 760Vadim ON no_dupes.PID = [760Vadim].[PID Number1]
WHERE (((no_dupes.PID) Like [760Vadim].[PID Number1]));
2。)将PID与两个字段进行比较时不起作用,返回0条记录......!
SELECT [760Vadim].*, no_dupes.PID
FROM no_dupes INNER JOIN 760Vadim ON (no_dupes.PID = [760Vadim].[PID Number2]) AND (no_dupes.PID = [760Vadim].[PID Number1])
WHERE (((no_dupes.PID) Like [760Vadim].[PID Number1])) OR (((no_dupes.PID) Like [760Vadim].[PID Number2]));
3。)这种作品......但是返回重复...并且返回设计视图,由于将AND更改为OR,它表示无效运算符,因此它不喜欢我的=符号?
SELECT [760Vadim].*, no_dupes.PID
FROM no_dupes INNER JOIN 760Vadim ON (no_dupes.PID = [760Vadim].[PID Number2]) OR (no_dupes.PID = [760Vadim].[PID Number1])
WHERE (((no_dupes.PID) Like [760Vadim].[PID Number1])) OR (((no_dupes.PID) Like [760Vadim].[PID Number2]));
还尝试了another forums建议: 1.)工作(我认为......),但重复一次!
SELECT [760Vadim].*
FROM 760Vadim, no_dupes
WHERE ((([760Vadim].folio)=[no_dupes].[DATA_SO1])) OR ((([760Vadim].[PID Number1])=[no_dupes].[PID])) OR ((([760Vadim].[PID Number2])=[no_dupes].[PID])) OR ((([760Vadim].[PID Number3])=[no_dupes].[PID]));
如果找到对开页的匹配项似乎会通过并返回记录,如果从其他三个字段中找到匹配的PID,则返回另一条记录(可能是重复的)。
从a similar question建议使用Join中的CONCAT功能删除重复项。
我还尝试在where语句之后添加:GROUP BY [760Vadim].*;
以删除重复但无效,它表示无法对所有记录进行分组,这就是我需要的。我是Access新手,但熟悉SQL(basics)。
道歉如果发布在错误的堆栈中,它可能在程序员或数据库堆栈交换中更好?
修改 我尝试了没有加入的选项:
SELECT DISTINCT v.*
FROM [760Vadim] v
WHERE
EXISTS(SELECT * FROM no_dupes nd
WHERE nd.pid LIKE v.[PID Number1]
OR nd.pid LIKE v.[PID Number2]
OR nd.pid LIKE v.[PID Number3]
OR nd.folio LIKE v.[folio] )
您提供的选项仅返回760Vadim表中的四列,最好看到所有这些列。 我也注意到它没有比较作品集的字段(说明书在我的漫游中丢失了,抱歉)。
我是否正确格式化为SELECT DISTINCT
760Vadim中的所有列如果在no_dupes中找到匹配项?
当我回到SQL /设计视图时,它会引发异常错误并将SQL更改为:
SELECT DISTINCT v.* INTO query_final
FROM 760Vadim AS v
WHERE (((Exists (SELECT * FROM no_dupes nd
WHERE nd.pid LIKE v.[PID Number1]
OR nd.pid LIKE v.[PID Number2]
OR nd.pid LIKE v.[PID Number3]
OR nd.folio LIKE v.[folio] ))<>False));
答案 0 :(得分:2)
你有几个选择
使用DISTINCT / JOIN
SELECT DISTINCT v.folio,
v.[PID Number1],
v.[PID Number2],
v.[PID Number3]
FROM [760Vadim] v
INNER JOIN no_dupes nd
ON nd.pid LIKE v.[PID Number1]
OR nd.pid LIKE v.[PID Number2]
OR nd.pid LIKE v.[PID Number3]
使用DISTINCT / EXISTS
SELECT DISTINCT
v.folio,
v.[PID Number1],
v.[PID Number2],
v.[PID Number3]
FROM [760Vadim] v
WHERE
EXISTS(SELECT * FROM no_dupes nd
WHERE nd.pid LIKE v.[PID Number1]
OR nd.pid LIKE v.[PID Number2]
OR nd.pid LIKE v.[PID Number3] )