2011-04-28 92 views
0

我的访问查询行为很奇怪,查询应该根据条件选择记录,但它不是这样做的。 查询是多个AND访问查询

select Distinct name from table1 where search like '%blue%' order by name 

当我运行上面的查询中的所有记录都包含关键字的蓝色返回。

如果我增加更多的字来此查询,

select Distinct name from table1 where search like '%blue%' And '%red%' order by name 

它应该选择那些蓝色和红色的录制。但它会返回蓝色或红色的记录。它不适用和。 这是表结构

id   path    name   search_keyword 
1   c:\my picture\ red door   red; 
2   c:\my picture\ red door   38; 
3   c:\my picture\ red door   wood; 
4   c:\my picture\ red door   2500; 
5   c:\my picture\ red door   smooth 
6   c:\my picture\ blue door   blue ; 
7   c:\my picture\ blue door   38; 
8   c:\my picture\ blue door   wood; 
9   c:\my picture\ blue door   2600; 
19   c:\my picture\ blue door   smooth; 

回答

2

注意查询模式的你在Access会话中运行该查询时使用。您可以在此链接找到的访问ANSI-89和ANSI-92查询模式进行深入讨论:Comparison of Microsoft Access SQL and ANSI SQL

在另一个你的堆栈溢出的问题,你是从C#中使用OleDb的与数据库操作运行类似查询。 OleDb表示您的查询将以ANSI-92模式运行,因此%是有效的通配符。

但是,对于在Access会话中运行的查询,默认模式是ANSI-89,这意味着对应的通配符是*而不是%

SELECT DISTINCT [name] 
FROM table1 
WHERE search_keyword Like '*blue*' 
ORDER BY [name] 

如果您已通过配置接入工具 - >选项 - >表/查询选项卡,然后选择“的SQL Server兼容语法(ANSI 92)”“此数据库”,查询将期望ANSI-92通配符。

SELECT DISTINCT [name] 
FROM table1 
WHERE search_keyword Like '%blue%' 
ORDER BY [name] 

另一种选择是使用ALike,而不是Like比较操作。 ALike指示数据库引擎期望ANSI-92通配符,而不管在哪里以及如何运行查询。这样,您可以在Access会话中使用ANSI-92通配符,而无需设置上述选项。

SELECT DISTINCT [name] 
FROM table1 
WHERE search_keyword ALike '%blue%' 
ORDER BY [name] 
+0

谢谢,这是非常有帮助的,它已经解决了问题。 – safi 2011-04-28 20:17:38

+1

请注意,在ANSI-92模式下运行数据库有一些意想不到的后果,例如完全不同的保留字集以及组合框中的自动完成功能中断。 – 2011-04-29 02:42:04

0

试试这个 从表1,其中搜索LIKE“%蓝色%”选择不重复的名称和搜索LIKE“%红色%”按名称顺序

+0

Rasel我试过这个,这是不工作的访问,在访问SQL我试过这个,它不工作。我正在使用访问2007 – safi 2011-04-28 08:50:27

+0

您是否尝试检索名称为'蓝色红色'或'红色蓝色'的行? – Rasel 2011-04-28 09:04:44

+0

我想检索名称是红色和蓝色 – safi 2011-04-28 09:05:23