Microsoft Access中的重复查询

时间:2013-07-24 18:10:22

标签: ms-access duplicates ms-access-2007

我正在尝试运行查询以在Field1上的表中查找重复项。但是,我想将我的查询限制为重复项,其中至少有一个(但不一定是两个)重复记录符合某些标准,如“非空”或类似于Field2中的“foo”。

原始的重复查询很简单,但我不确定如何执行此操作。任何帮助将不胜感激。

In(SELECT [Field1] FROM [Table] As Tmp GROUP BY [Feild1] HAVING Count(*)> 1)

3 个答案:

答案 0 :(得分:1)

您可以使用WHERE子句告诉db引擎在处理GROUP BY之前忽略某些行,这意味着这些行将被排除在{{ 1}}。

我不确定我是否理解了要忽略哪些行的标准,但是会将此作为起点......

Count

关于SELECT tmp.[Field1] FROM [Table] As Tmp WHERE tmp.Field1 Is Not Null AND NOT (tmp.Field2 ALike '%foo%') GROUP BY tmp.[Field1] HAVING Count(*)>1; 的一些注意事项:

ALike在Access SQL中有效。它表示数据库引擎需要ANSI通配符ALike%,而不是非标准的访问通配符_*

在Access应用程序会话中,您可能习惯?,这通常有效。但是,如果您在Access会话中从ADO运行查询,或者已选择数据库选项以使用“SQL Server兼容语法(ANSI 92)”,则必须使用标准ANSI通配符:Like '*foo*'。此外,从使用OleDb连接到db文件的Access会话外部,您必须使用标准ANSI通配符。

总之,Like '%foo%'需要不同的外卡,具体取决于上下文。但是,Like 始终使用标准ANSI通配符,无论上下文如何。因此,对于ALike,无论您在何处以及如何使用Access查询,它都将以相同的方式运行。

答案 1 :(得分:0)

您可以尝试在CASE子句中添加WHERE语句,如下所示:

SELECT Field1
FROM Table

WHERE 1 =
CASE
    WHEN Field1 IS NOT NULL THEN 1
    WHEN Field1 LIKE '%foo%' THEN 1
    ELSE 0   -- Otherwise, don't include in result set.
END

GROUP BY Field1
HAVING COUNT(*) > 1

答案 2 :(得分:0)

使用嵌套查询我们可以将记录限制为重复的记录,然后我们可以过滤以找到符合字段2上其他标准的记录

SELECT [Field1],[Field2] FROM
[Table] where
(Field2 is NOT NULL OR Field2 like '%foo%') -- Add additional conditions here
AND Field1 IN
    (SELECT [Field1] FROM [Table] As Tmp GROUP BY [Feild1] HAVING Count(*) > 1 )