我正在尝试运行查询以在 Field1 的表中查找重复项。但是,我想将我的查询限制为重复记录,其中至少一个(但不一定是两个)重复记录符合特定条件,例如 Field2 中的“非空”或“foo”。
原始重复查询很容易,但我不确定如何执行此操作。任何帮助将不胜感激。
In (SELECT [Field1] FROM [Table] As Tmp GROUP BY [Feild1] HAVING Count(*)>1 )
我正在尝试运行查询以在 Field1 的表中查找重复项。但是,我想将我的查询限制为重复记录,其中至少一个(但不一定是两个)重复记录符合特定条件,例如 Field2 中的“非空”或“foo”。
原始重复查询很容易,但我不确定如何执行此操作。任何帮助将不胜感激。
In (SELECT [Field1] FROM [Table] As Tmp GROUP BY [Feild1] HAVING Count(*)>1 )
您可以使用WHERE
子句告诉 db 引擎在处理之前GROUP BY
忽略某些行,这意味着这些行将从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
:
ALike
在 Access SQL 中有效。它指示 db 引擎期待 ANSI 通配符%
和_
,而不是非标准的 Access 通配符*
和?
.
在 Access 应用程序会话中,您可能已经习惯了Like '*foo*'
,并且这通常是有效的。但是,如果您在 Access 会话中从 ADO 运行查询,或者选择了数据库选项以使用"SQL Server Compatible Syntax (ANSI 92)",则必须使用标准 ANSI 通配符:Like '%foo%'
. 此外,从使用 OleDb 连接到 db 文件的 Access 会话之外,您必须使用标准 ANSI 通配符。
总之,Like
根据上下文需要不同的通配符。但是,无论上下文如何,ALike
始终使用标准 ANSI 通配符。因此,使用ALike
,无论您在何处以及如何使用,Access 查询都将运行相同的查询。
使用嵌套查询,我们可以将记录限制为重复的记录,然后我们可以过滤以找到符合字段 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 )
您可以尝试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