问题描述
|
使用MS Access 2010,我有两个表要通过比较相似的字段(1:1和1:M)在其中一个表中找到匹配的记录。
表1,[760Vadim]具有四个字段:对开,PID号1,PID号2,PID号3
表2,[no_dupes]有两个字段:Folio,PID
我需要从[no_dupes]中的相似字段中找到[760Vadim]中具有匹配值的所有记录。
比较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]));
还尝试了另一个论坛的建议:
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,则返回另一条记录(可能是重复的)。
对于类似的问题,建议使用联接内部的CONCAT功能删除重复项。
我还尝试添加:在where语句之后的GROUP BY [760Vadim].*;
删除重复项但无济于事,它说不能对所有记录进行分组,这是我需要的。我是Access的新手,但对sql(基本)有所了解。
抱歉,如果张贴在错误的堆栈中,它可能在Programmers或Database stackexchange中坐得更好?
编辑:
我尝试了不带Join的选项:
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表中的四列,因此最好查看所有列。
我还注意到它没有比较作品集字段(对不起,该规格在我的漫步中丢失了)。
如果在no_dupes中找到匹配项,我是否将其正确格式化为760Vadim中所有列的SELECT disTINCT
?
当我回到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));
解决方法
你有几个选择
使用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]
使用区域/存在
SELECT DISTINCT
v.folio,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] )