0

我正在尝试运行查询以在 Field1 的表中查找重复项。但是,我想将我的查询限制为重复记录,其中至少一个(但不一定是两个)重复记录符合特定条件,例如 Field2 中的“非空”或“foo”。

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

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

4

3 回答 3

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 查询都将运行相同的查询。

于 2013-07-24T19:06:55.083 回答
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 )
于 2013-07-24T18:25:05.063 回答
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
于 2013-07-24T18:18:12.593 回答