如何查找匹配记录,将表中的一个字段与另一个表中的多个字段进行比较?

时间:2011-06-14 20:42:53

标签: sql ms-access

使用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));

1 个答案:

答案 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] )