我正在尝试运行查询以在Field1上的表中查找重复项。但是,我想将我的查询限制为重复项,其中至少有一个(但不一定是两个)重复记录符合某些标准,如“非空”或类似于Field2中的“foo”。
原始的重复查询很简单,但我不确定如何执行此操作。任何帮助将不胜感激。
In(SELECT [Field1] FROM [Table] As Tmp GROUP BY [Feild1] HAVING Count(*)> 1)
答案 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 )