有关access查询:查询库存量大怎么办小于订货总量的产品号

Access俱乐部
Access入门经典视频《运用Access实现降本增效》(免费)[] | 免费《Access五节必修课》[]
?&&&&?&&&&?&&&&?&&&&
您的位置:  > >
【Access示例】两种计算库存方法的示例
来源:&&点击数:3266&&评论数:1 &|&&|&
时 间: 13:29:24
作 者:&&&ID:6392&&城市:昆山
摘 要:两种计算库存方法的示例
用联合查询和NZ函数
转自:AccessHome
      
&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】
Access网店
价格:¥0 元
价格:¥50 元
价格:¥50 元
(6-6&15:47)
(6-6&15:44)
(6-6&15:34)
(6-6&13:16)
(6-6&10:07)
(6-5&17:10)
(6-5&15:41)
(6-5&14:42)
(6-5&14:05)
(6-5&11:20)
Access软件网 版权所有 CopyRight
提供支持 本站特聘法律顾问: 李慧 律师Access俱乐部
Access入门经典视频《运用Access实现降本增效》(免费)[] | 免费《Access五节必修课》[]
?&&&&?&&&&?&&&&?&&&&
您的位置:  > >
[access查询]库存计算方法剖析
来源:&&点击数:11046&&评论数:10 &|&&|&
时 间: 22:00:44
作 者:&&&ID:8859&&城市:广州
摘 要:&&&&论坛中计算库存的示例很多,但很少对库存计算进行详细论述,对初学ACCESS者而然,示例未必能够直接套用,所以必须懂得计算库存原理,才能灵活地运用。&&&&于日对示例中的错误进行了修改,从而避免了&月结存查询&中跨年查询时结果有误的问题。
论坛中计算库存的示例很多,但很少对库存计算进行详细论述,对初学ACCESS者而然,示例未必能够直接套用,所以必须懂得计算库存原理,才能灵活地运用。为便于论述,本文中所举例子都是以“期初库存”为0、“期初入库”为0来计算,你可以这样理解,当建数据库时仓库内还是空空如也。因不同企业情况不同,聪明的读者只需明白计算的原理,至于什么“期初库存”等你自己修改一下计算公式即可。
计算库存一般是计算以下三种库存:实时库存、当日库存、每月结存。
一、实时库存的计算
1. 实时库存计算方法
& 计算公式:实时库存=入库数量总计-出库数量总计(或再加上期初库存或期初入库)
2.查询设置
&&&& 因公式较简单,用SQL语句生成查询又或在查询设计视图中设置均可,示例中是在查询设视图中进行设置,因对初学ACCESS者而言较易操作。
二、 当日库存
1.当日库存计算方法
&&& 当日库存是指查询数据库中某一日的库存量,计算公式其实和实时库存计算公式是一样的,只不过截止日期不同罢了。
&&&& 例如你想查当天的库存,你只要把当天及之前的总入库,减去当天及之前的总出库即可求得当天的库存量,所以其
&&& 计算公式:当日库存=(查询日期当天及之前)入库数量总计-(查询日期当天及之前)出库数量总计
2.查询设置
&&&& 假设你已设置好一个名为“日库存查询窗体”用于查询日库存,并且窗体上有一名为“日期”的文本框或日期控件(见图2)。
&&&& 然后根据以上查询窗体写如下SQL查询语句(注意语句中的查询条件):
&&&&& Select 产品编号, sum(进仓数量) AS 进仓数量总计, 0 AS 出仓数量总计 FROM 入库 where 进仓日期&=[forms]![日库存查询窗体]![日期] GROUP BY 产品编号
UNION Select 产品编号, 0 AS 进仓数量总计, sum(出仓数量) AS 出仓数量总计 FROM 出库 where 出仓日期&=[forms]![日库存查询窗体]![日期] GROUP BY 产品编号;
表示统计“进仓日期”为“日库存查询窗体”中“日期”文本框上所输入的查询日期,当天及之前的进库数量总计。
表示统计“出仓日期”为“日库存查询窗体”中“日期”文本框上所输入的查询日期,当天及之前的出库数量总计
&计算出查询当日及之前的进出库数量,计算当天库存量就好办了,接着在以上联合查询基础上生成一个“日库存查询”(图3)。
注意,以上查询如果你SQL语句熟练可一步到位,但本人SQL语句水平有限,只好分两步走,朋友们不要见笑,不足之处还望请指点以提高本人水平。
三、每月结存
&&&& 每月结存计算公式如下:
&&&& 每月结存=上月结存+本月入库-本月出库
&&&& 也就是说,要计算每月结存,要分别求得上月结存、本月入库总数和本月出库总数,以下就计算上述三项进行分别论述。
1. 上月结存的计算方法
&&&& 经过之前当日库存计算分析,相信聪明的朋友们对月结存计算已有一定概念了。
&&&& 上月结存计算方法跟当日结存的计算方法类似,还是建立在实时库存计算方法的基础之上。
&&&&& 例如:要查询2010年7月的库存,你首先要求得日时的库存(即上月结存),因此计算公式为:
&&&& 上月结存=(查询年份当年及之前年份、查询月份之前月份)入库数量总计-(查询年份当年及之前年份、查询月份之前月份)出库数量总计
2. 上月结存查询设置
&&& 同样地,假设你已设置好一个名为“库存月报查询窗体”用于查询每月结存数量,并且窗体上有两个分别名为“年”和“月”的文本框(如图4)。
&&& 然后根据以上查询窗体写如下SQL查询语句(注意语句中的查询条件):
Select 产品编号, sum(进仓数量) AS 进仓数量总计, 0 AS 出仓数量总计 FROM 入库 where month(进仓日期)<FORMS!库存月报查询窗体!月 AND year(进仓日期)<="forms!库存月报查询窗体!年" GROUP BY 产品编号
UNION Select 产品编号, 0 AS 进仓数量总计, sum(出仓数量) AS 出仓数量总计 FROM 出库 where month(出仓日期)<FORMS!库存月报查询窗体!月 AND GROUP BY year(出仓日期)<="forms!库存月报查询窗体!年" 产品编号;
&&& 表示统计“进仓日期”为“库存月报查询窗体”中“月”文本框上所输入的查询月份之前所有月份、“年”文本框上所输入的查询年份及之前的年份进库数量总计。
&&& 表示统计“出仓日期”为“库存月报查询窗体”中“月”文本框上所输入的查询月份之前所有月份、“年”文本框上所输入的查询年份及之前的年份出库数量总计。
3.本月入库和本月出库查询设置
&&& 本月入库和本月月出库的计算,只需对上月结存查询语句稍作修改即可:
Select 产品编号, sum(进仓数量) AS 本月入库, 0 AS 本月出库 FROM 入库 where month(进仓日期)=forms!库存月报查询窗体!月 and year(进仓日期)=forms!库存月报查询窗体!年 GROUP BY 产品编号
UNION ALL Select 产品编号, 0 AS 本月入库, sum(出仓数量) AS 本月出库 FROM 出库 where month(出仓日期)=forms!库存月报查询窗体!月 and year(出仓日期)=forms!库存月报查询窗体!年 GROUP BY 产品编号;
表示统计“进仓日期”为“库存月报查询窗体”中“月”文本框上所输入的查询月份、“年”文本框上所输入的查询年份的进库数量总计。
表示统计“出仓日期”为“库存月报查询窗体”中“月”文本框上所输入的查询月份、“年”文本框上所输入的查询年份的出库数量总计。
4. 每月结存查询设置&&
得出上月结存、本月入库和本月出库后,用一查询计算出本月结存(图5)。
相关示例下载:
Access软件网官方交流QQ群 (群号:)
      
&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】
Access网店
价格:¥0 元
价格:¥50 元
价格:¥50 元
(6-6&15:47)
(6-6&15:44)
(6-6&15:34)
(6-6&13:16)
(6-6&10:07)
(6-5&17:10)
(6-5&15:41)
(6-5&14:42)
(6-5&14:05)
(6-5&11:20)
Access软件网 版权所有 CopyRight
提供支持 本站特聘法律顾问: 李慧 律师业务很简单,进库、出库。只需要输入时间、单号、出库产品型号、数量。 要求能自动查询库存 自动生成报表_百度知道
业务很简单,进库、出库。只需要输入时间、单号、出库产品型号、数量。 要求能自动查询库存 自动生成报表
我有更好的答案
xcel版可参考:http://www.html" target="_blank">/Soft/Html/6.excelba:<a href="/Soft/Html/150://www.excelba:///Soft/Html/150.excelba
其他类似问题
您可能关注的推广回答者:
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁用access做个库存,SQL 联合查询,入库减出库得到库存不对,请教!_百度知道
用access做个库存,SQL 联合查询,入库减出库得到库存不对,请教!
入库数量.出库数量)) AS 库存 FROM 出库明细 INNER JOIN 入库明细 ON 入库明细, 入库明细,我要把他们也显示出来.出库数量; 得到的库存1003万用表和1005没有.入库数量.物件编号.入库数量)-Sum(出库明细://g.hiphotos://g.baidu://g.com/zhidao/wh%3D600%2C800/sign=3fe7bec238f0be71f1eff3adfd5ca7bcb0a46d489.出库数量.jpg" />.baidu.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http.物件编号=出库明细, 出库明细, 出库明细.com/zhidao/wh%3D450%2C600/sign=30f038aae856b005c9eb/adfd5ca7bcb0a46d489.hiphotos,问题在哪<a href="http.hiphotos, (Sum(入库明细.物件编号 GROUP BY 入库明细.jpg" esrc="httpSELECT 入库明细.com/zhidao/pic/item/adfd5ca7bcb0a46d489.物件编号.baidu, 入库明细
提问者采纳
物件编号&nbsp,&nbsp,&LEFT&出库明细&入库明细;入库明细;NULL,TRUE.出库数量))&nbsp.入库数量)-Sum(SWITCH(出库明细;入库明细&ON&nbsp.物件编号.入库数量.出库数量&入库明细;JOIN&nbsp.物件编号,&nbsp,出库明细;出库明细.出库数量;入库明细,&nbsp.物件编号=出库明细;(Sum(入库明细;入库明细;BY&nbsp.入库数量.出库数量,0;FROM&AS&库存&出库明细,&nbspSELECT&IS&GROUP&nbsp
还是不行,问题在哪,我把文件发给你SELECT 。。省略&。。&& (Sum(入库明细.入库数量)-Sum(SWITCH(出库明细.出库数量 IS NULL,0,TRUE,出库明细.出库数量))) AS 库存FROM 出库明细 LEFT JOIN 入库明细 ON 入库明细.物件编号=出库明细.物件编号GROUP BY 入库明细.物件编号, 入库明细.入库数量, 出库明细.出库数量;
我你,查收下,浏览器右上角
提问者评价
非常感谢,很专业,热心
其他类似问题
按默认排序
其他1条回答
总有一个能行的。三个你换着来试,会出来三个选项,称为联接属性,双击两个表的关系连线,在查询视图中查询语法问题
联合查询的相关知识
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Access 2003完整教程:查询疑难解答 (MDB)
Access 2003完整教程:查询疑难解答 (MDB)
- 查询疑难解答 (MDB)
Access 2003完整教程:查询疑难解答 (MDB)
得到异常消息。
得到 SQL 语法消息。
您可能在SQL 视图中键入了不正确的语法。您的查询是在其他ANSI SQL 查询模式而非Microsoft Access 数据库的当前模式中创建的。
为什么应避免将在不同 ANSI SQL 查询模式中创建的查询混合在一起
两种ANSI SQL 查询模式(即 ANSI-89 和 ANSI-92)并不兼容。在创建Microsoft Access 数据库时,需要确定将要使用何种查询模式,因为混合在不同查询模式下创建的查询可能会发生运行时错误或意想不到的结果。数据类型、保留字和通配符的范围在每种查询模式下都是不同的。
有关用通配符进行查询的示例
如果一个查询在条件表达式中使用了通配符,则在每种查询模式下会产生不同的结果。例如,如果:
在设为 ANSI-92 查询模式的数据库中运行 ANSI-89 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U*'
将返回国家/地区名为“U*”的所有客户,而不是返回国家/地区名以“U”打头的所有客户,因为星号 (*) 不是 ANSI-92 SQL 中的通配符。在设为 ANSI-89 查询模式的数据库中运行 ANSI-92 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U%'
将返回国家/地区名为“U%”的所有客户,而不是返回国家/地区名以“U”打头的所有客户,因为百分号 (%) 不是 ANSI-89 SQL 中的通配符。
有关具有重复字段和别名的查询的示例
如果一个查询使用了与基础列同名的别名,并且使用不明确的名称创建计算字段,则在不同的查询模式下进行查询时会产生不同的结果。例如,如果运行以下查询:
SELECT Orders.OrderID AS Freight, Orders.Freight, [Freight]*1.1 AS [New Freight] FROM O
在 ANSI-92 SQL 下,Access 用 Freight 字段计算 New Freight 值,于是每个 Freight 值增加 10%。在 ANSI-89 SQL 下,Access 用 Freight 别名计算 New Freight 值,于是每个 OrderID 值增加 10%。
如何避免因在同一数据库中混合了在不同 ANST SQL 查询模式下创建的查询而导致的问题?
通常,为防止由于混合在不同 ANSI SQL 查询模式下创建的查询所导致的问题,应该避免下列操作:
将设为 ANSI-92 SQL 查询模式的 Access 数据库,从 2002 - 2003 文件格式转换为 2000 或 97 文件格式。只有 2002 - 2003 文件格式支持 ANSI-92 SQL 查询模式。创建了一个或多个查询后,更改当前数据库的 ANSI-92 SQL 查询模式。如果必须这样做,应再次测试现有查询以确保其仍然正常运行或产生预期的结果,必要时重写查询。将创建于一种 ANSI SQL 查询模式下的查询导入到设置为另一种模式的 Access 数据库中,或者将创建于一种 ANSI SQL 查询模式下的查询导出到设为另一种模式的 Access 数据库中。在现有应用程序中更改 ANSI SQL 查询模式。这样做将会中断您的应用程序,并需要重写应用程序。
在 Access 2000 中,只能以编程方式来更改 ANST SQL 查询模式,任何在 ANST-92 查询模式下创建的查询在“数据库”窗口中都被隐藏。在 Access 2002 或更高版本中,您或用户可以通过用户界面来更改 ANST SQL 查询模式,ANSI-92 查询不再在“数据库”窗口中隐藏。因此,应通过帮助保护代码并阻止通过应用程序的用户界面更改查询模式,防止对应用程序的 ANST SQL 查询模式无意或有意的更改。使用不明确的别名和列名。为了避免混乱,应确保别名和列名在一个 SQL 语句中始终是唯一的。
得到“不能绑定名称 &name&”的消息。
如果在“查询参数”对话框中没有明确声明用于交叉表查询或交叉表查询及图表所基于的查询的参数,则可能会遇到此信息。若要解决此问题,请执行下列操作:
请在包含参数的查询中,在“查询参数”对话框中指定参数及其数据类型。
操作方法:
单击“查询”菜单上的“参数”命令。在第一个“参数”单元格中,键入在查询设计网格中要输入的第一个提示。在“数据类型”单元格的右侧,按照下列指导规则,单击适当的数据类型:
如果参数字段数据类型是在“数据类型”单元格中单击该数据类型
货币、日期/时间、备注、OLE 对象、文本和是/否?货币、日期/时间、备注、OLE 对象、文本和是/否
数字字节、单精度、双精度、整型、长整型与同步复制 ID。这些类型与五个“数字”数据类型的“字段大小”属性设置相对应。
未知值。可以接受任何数据类型的通用数据类型。
二进制二进制。与指向可识别该数据类型的链接表的参数查询一起使用(Microsoft Access 不识别这种数据类型)。
对每一个要指定数据类型的参数,重复第 2 步和第 3 步。
在同一查询中,设置“标题”属性。
操作方法:
可以更改交叉表查询中的顺序或限制列标题。例如,在包含各个月份的列标题中,可以使月份按时间排序,而不是按字母顺序。也可以限制为从一月到六月的列。
在“设计”视图中打开交叉表查询。在设计网格和字段列表之外,单击查询“设计”视图的背景。在工具栏上,单击“属性”以显示查询的属性表。在“列标题”属性框中,按希望的显示顺序输入要显示的列标题。在列标题之间,请键入逗号或适合自己国家/地区(有关国家/地区的列表分隔符的内容,请查看 Windows“控制面板”中的“区域设置”)的分隔符。
输入的列标题必须与查询数据表的列标题完全相符。例如,如果数据表中的列标题是“USA”,则必须输入“USA”作为列标题,而不是“US”(按 Enter 或者将指针移动到其他位置之后,Microsoft Access 会将每个列标题用引号括起来)。要查看查询结果,可单击工具栏上的“视图”。
如果需要经常运行交叉表查询,或者将它用作窗体、报表或数据访问页的基础查询,用上述过程指定固定的列标题可以加快查询的运行速度。如果在不同的查询中频繁地使用相同的列标题,考虑创建带有一个文本字段的表以存储列标题。需要时请打开该表并将标题复制到“列标题”框中。
得到键冲突的消息。
以下情形将会出现键值冲突的问题:
试图以违反参照完整性规则的方法,来对相关表执行追加、删除或更新记录的查询。查询试图追加或更新包含已存在于目标表中的主键值的记录。
如果运行了以上查询,将不会修改造成键值冲突的记录。
如果要以违反参照完整性的方法修改记录,可以中断相互影响的表的关系或关闭参照完整性,然后一次一个地修改受影响的表。但是,两个表中的结果数据可能会冲突。
得到违反有效性规则的消息。
如果试图更新或追加违反字段或记录有效性规则的记录,将出现有效性规则冲突的消息。
限制或验证数据
字段的有效性规则用于检查用户离开字段时字段中的输入值。记录有效性规则可以控制记录保存的时间。与字段有效性规则不同,记录有效性规则可以引用其他字段。
您还能够确定在指定有效性规则或更改“必填字段”或“允许零长度字符串”属性之前已经存在的数据是否不符合当前设置。
在“设计”视图中打开表。请执行下列操作之一:
定义有效性规则以控制字段的允许输入值
在窗口上部,单击将定义有效性规则的字段。在窗口下部,单击“有效性规则”属性框,然后键入有效性规则,或单击“生成”按钮,用表达式生成器创建有效性规则。
例如,可以为“数量”字段定义有效性表达式“>9”,来防止用户输入小于 10 的订单。在“有效性文本”属性框,键入不符合规则时要显示的消息。
例如,对于有效性表达式“>9”,可以输入“您必须订购 10 个或 10 个以上”。如果在包含数据的字段中设置有效性规则,在保存表时,Microsoft Access 将询问是否将新规则应用于现有数据。如果单击“是”,则当现有数据不符合有效性规则时,Access 将发出警告。
定义有效性规则以控制保存记录的时间
单击工具栏上的“属性”,以显示表的属性表。在“有效性规则”属性框中键入有效性规则,或者单击“生成”按钮以便用表达式生成器创建有效性规则。
例如,可以定义有效性表达式“[到货日期]&=[订购日期]+30”,以确保“到货日期”字段中输入的日期与“订购日期”字段中的日期相距不超过 30 天。在“有效性文本”属性框,键入不符合规则时,希望 Microsoft Access 显示的消息。
例如,对于有效性表达式“[到货日期]&=[订购日期] +30”,可以输入“到货日期必须在订货日期以后 30 天以内”。如果在包含数据的字段中设置有效性规则,在保存表时,Microsoft Access 将询问是否将新规则应用于现有数据。如果单击“是”,则当现有数据不符合有效性规则时,Microsoft Access 将发出警告。
测试在指定有效性规则之前已经存在的数据
用鼠标右键单击表的标题栏,然后单击“测试有效性规则”。
如果现有数据不符合有效性规则,或不符合“必填字段”或“允许零长度字符串”的设置,Microsoft Access 将向您发出警告。
得到“查询包含模糊的外部联接”的消息。
看到下列消息时:
“无法执行 SQL 语句,因为包含模棱两可的外部联接。”
表明用户试图执行包含多个联接的 SQL 语句。在 Microsoft Access 中有三种联接:内部联接(也称为等效联接)、左外部联接以及右外部联接。在多个联接中,查询的结果因联接的类型与在查询中执行联接的顺序而不同。
使用三个表的多个联接的示例
例如,如果有三个表,Consultants、Active Consultants 和 Projects,而且通过下列方法联接这些表创建 SQL 查询:
Consultants LEFT OUTER JOIN Active Consultants INNER JOIN Projects
Microsoft Access 可以用两种方式来处理该查询:
(Consultants LEFT OUTER JOIN Active Consultants) INNER JOIN Projects
Access 首先在 Consultants 和 Active Consultants 表中创建左外部联接,然后在这两个表的结果与 Projects 表间创建内部联接。
Consultants LEFT OUTER JOIN (Active Consultants INNER JOIN Projects)
Access 在 Consultants 表与 Active Consultants 和 Projects 表的内部联接结果间创建左外部联接
因为 Microsoft Access 可以在这两种不同的联接方式中产生不同的结果,所以必须指定联接的方式,方法是:更改一个联接或将查询分为两个查询。
非模棱两可的多联接
下列联接的组合仅可能生成一个结果,将不生成“模棱两可的外部联接”消息:
Consultants INNER JOIN Active Consultants INNER JOIN Projects
Consultants INNER JOIN Active Consultants LEFT OUTER JOIN Projects
Consultants LEFT OUTER JOIN Active Consultants LEFT OUTER JOIN Projects
Consultants RIGHT OUTER JOIN Active Consultants INNER JOIN Projects
Consultants RIGHT OUTER JOIN Active Consultants LEFT OUTER JOIN Projects
Consultants RIGHT OUTER JOIN Active Consultants RIGHT OUTER JOIN Projects
模棱两可的多个联接
下列联接组合可能产生多个结果并生成一个“模棱两可的外部联接”消息:
Consultants INNER JOIN Active Consultants RIGHT OUTER JOIN Projects
Consultants LEFT OUTER JOIN Active Consultants INNER JOIN Projects
Consultants LEFT OUTER JOIN Active Consultants RIGHT OUTER JOIN Projects
得到类型不匹配的消息。
数据在基表或基础查询中时,请确认指定的条件与基础查询或基表中的数据类型是否相同。例如,“再订购量”字段的数据类型为“数字”。因此,如果输入条件“50”,就会产生错误,因为 Microsoft Access 将双引号之中的值转译为文本,而不是数字。
其他造成数据类型冲突的情况包括:
为“查阅”字段指定条件时,条件使用了在查阅列表中所显示的值,而不是与其关联的外键值。由于外键值实际上是存储在基表中的值,因此指定字段的条件时,应使用外键值。为“货币”字段的条件键入了美元符 ($)。请删除美元符,然后查看结果。
请确认在查询中的每一对联接字段的数据类型是否相同。如果不同,更改其中之一的联接字段的数据类型以与其他数据类型相符合。
得到“预计参数太少”的消息。
如果导出至IDC文件类型的参数查询尚未在“查询参数”对话框中指定数据类型,就有可能出现此消息。
在“数据库”窗口中,单击“对象”下的“查询”。单击要修改的参数查询的名称,然后单击“数据库”窗口工具栏上的“设计”。为参数指定数据类型。
操作方法:
单击“查询”菜单上的“参数”命令。在第一个“参数”单元格中,键入在查询设计网格中要输入的第一个提示。在“数据类型”单元格的右侧,按照下列指导规则,单击适当的数据类型:
如果参数字段数据类型是在“数据类型”单元格中单击该数据类型
货币、日期/时间、备注、OLE 对象、文本和是/否?货币、日期/时间、备注、OLE 对象、文本和是/否
数字字节、单精度、双精度、整型、长整型与同步复制 ID。这些类型与五个“数字”数据类型的“字段大小”属性设置相对应。
未知值。可以接受任何数据类型的通用数据类型。
二进制二进制。与指向可识别该数据类型的链接表的参数查询一起使用(Microsoft Access 不识别这种数据类型)。
对每一个要指定数据类型的参数,重复第 2 步和第 3 步。
保存并运行查询。
得到有关追加查询中 s_Generation 的消息。
如果追加查询设计网格中的“字段”行包含了星号 (*),则在副本数据库中执行该追加查询时将得到上述错误信息。因为星号会选取一个基表中的全部字段。如果要避免这个问题,请从设计网格中删除星号,然后从表的字段列表中将每个字段添加到设计网格中,方法是:双击字段列表的标题栏。
得到“操作必须使用可更新查询”的消息。
在当前查询的“更新到”行中包括了交叉表查询或选择查询中的字段,在交叉表查询或选择查询中,对该字段进行聚合(总计)计算(使用“总计”行或“字段”行的域函数)时,会发生该错误。如果要使用另一个字段的聚合来更新字段,请在更新查询本身中计算聚合,而不是其他查询。
在当前查询的查询“设计”视图中,删除从交叉表或选择查询中添加的字段(在其中对字段进行聚合计算)。在要更新字段的“更新到”单元格中输入一个域函数,此函数将进行与选择或交叉表查询中相同的对字段的聚合计算。
例如,如果在“产品”表中有一个称作“销售额”的计算字段,可以在“订单明细”表的“数量”和“单价”字段中进行更新,方法是:将其添加到更新查询的设计网格中,然后在“更新到”单元格中输入下列字段函数。
DSum("[Quantity] * [UnitPrice]", "Order Details", "[ProductID]=" & [ProductID])
若要运行查询,请在工具栏上单击“运行”。若要查看结果,请单击“数据库”窗口中“对象”下的“表”,再单击“数据库”窗口工具栏上的“打开”,以打开表。
查询中的通配字符表现异常。
两种ANSI SQL 查询模式,ANSI-89 和 ANSI-92,是互不兼容的,使用不同的通配符。例如,如果:
在设为 ANSI-92 查询模式的数据库中运行 ANSI-89 SQL查询,如:
SELECT * FROM Customers WHERE Country Like 'U*'
它返回来自名为“U*”的国家/地区的所有客户,而不是所有以字母“U”打头的国家/地区,因为星号 (*) 在 ANSI-92 SQL 中不是通配符。在设为 ANSI-89 查询模式的数据库中运行 ANSI-92 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U%'
它返回来自名为“U%”的国家/地区的所有客户,而不是所有以字母“U”打头的国家/地区,因为百分号 (%) 在 ANSI-89 SQL 中不是通配符。
当创建Microsoft Access 数据库时,需要决定使用哪种查询模式,因为如果稍后在不同于 Access 数据库当前模式的 ANSI SQL 查询模式下创建一个的查询,您的查询就可能会生成运行时错误或产生意外结果。
关于使用通配符搜索部分或完全匹配的值
在指定要查找的内容时,如果出现以下情况,可以使用通配符作为其他字符的占位符:
仅知道要查找的部分内容。要查找以指定字母打头或符合某种模式的内容。
通配符必须与带“文本”数据类型的字段一起使用。但在未使用 Microsoft Windows“控制面板”更改这些数据类型的区域设置的情况下,可以将通配符与其他数据类型(如日期)一起使用。
如果在Microsoft Access 数据库中使用的是 Microsoft Jet 数据库引擎 SQL,则可以在查询和表达式中使用下列通配符查找字段值、记录或文件名之类的内容。也可以在 Access 数据库或Microsoft Access 项目中的“查找和替换”对话框中使用这些字符。
字符说明示例
*与任何个数的字符匹配。在字符串中,它可以当作第一个或最后一个字符使用。wh*可以找到 what、white 和 why
与任何单个字母的字符匹配。B?ll可以找到 ball、bell 和 bill
[ ]与方括号内任何单个字符匹配。B[ae]ll可以找到 ball 和 bell 但找不到 bill
!匹配任何不在方括号之内的字符。b[!ae]ll可以找到 bill 和 bull 但找不到 ball 或 bell
-与某个范围内的任一个字符匹配。必须按升序指定范围(A 到 Z,而不是 Z 到 A)。b[a-c]d可以找到 bad、bbd 和 bcd
#与任何单个数字字符匹配。1#3可以找到 103、113、123
若要在 Microsoft Access 项目中或在使用了与 Microsoft SQL Server 兼容的语法的 Microsoft Access 数据库中查找字段值、记录或文件名之类的内容,请使用下列 ANSI-92 通配符。
注释如果在 Access 项目或 Access 数据库中使用“查找和替换”对话框,而 Access 项目或 Access 数据库使用了与 Microsoft SQL Server 兼容的语法,就必须使用 Microsoft Jet SQL 通配符。
字符说明示例
%与任何个数的字符匹配,在字符串中,它可以当作第一个或最后一个字符使用。wh%可以找到 what、white 和 why
_与任何单个字母的字符匹配。B_ll可以找到 ball、bell 和 bill
[ ]与方括号内任何单个字符匹配。B[ae]ll可以找到 ball 和 bell 但找不到 bill
^匹配任何不在方括号之内的字符。b[^ae]ll可以找到 bill 和 bull 但找不到 ball 或 bell
-与某个范围内的任一个字符匹配。必须按升序指定范围(A 到 Z,而不是 Z 到 A)。b[a-c]d可以找到 bad、bbd 和 bcd
使用通配符搜索其他通配符,如星号 (*)、问号 (?)、数字符 (#)、左方括号 ([) 或连字符 (-) 时,必须将要搜索的项括在方括号内;如果搜索感叹号 (!) 或右方括号 (]),则不必将其括在方括号内。
例如,若要搜索问号,请在“查找”对话框内键入[?]。如果要同时搜索连字符和其他字符,请将连字符放在方括号内所有其他字符之前或之后。(但是,如果在左方括号之后有一个感叹号,请将连字符放在感叹号之后。)?必须将左、右方括号放在下一层方括号内 ([[ ]]),才能同时搜索一对左、右方括号 ([ ]),否则 Microsoft Access 会将这种组合作为零长度字符串处理。
在数据访问页和窗体中,相同的基础查询表现不同。
以窗体为基础的查询在Microsoft Access 数据库的当前ANSI SQL 查询模式设置下运行。另一方面,以数据访问页为基础的查询总是在 ANSI-92 SQL 查询模式下运行,因为页是使用ADO和 Microsoft Jet OLE DB 提供程序与 Access 数据库连接,而这二者只能使用 ANSI-92 SQL。因此,如果 Access 数据库的 SQL 查询模式设为 ANSI-89,基于窗体的查询作为 ANSI-89 查询运行,但基于页的查询总是在 ANSI-92 下运行,无论 Access 数据库设置如何都如此。若要解决这一问题,就要对窗体使用另一种查询,如果可能,要为窗体重写查询,以生成与页的基础查询同样的结果。
未得到想要的记录。
记录太多。
如果查询中的表没有直接或间接联接到另一个表或查询,Microsoft Access 就无法知道记录间的关系,因而会显示两表间记录的每个组合(称为“叉积”或“卡氏乘积”)。因此,如果每个表有十条记录,查询的结果将包含一百条记录(即十乘十)。这还意味着运行查询可能花了很长时间,但最后却可能得到没有意义的结果。若要防止此类情况发生,应在表或查询之间创建一个联接。如果表或查询已经联接,请检查每条联接线的联接属性,查看实际的联接类型。联接属性决定了表或查询是联接其全部记录,还是只联接与其他表的记录相匹配的记录。
添加条件来限制查询检索的记录。只检索符合所定义的条件的记录。如果已经指定了条件,可能要使用And运算符为同一字段或其他字段指定附加的条件。而且应验证现有条件是否正确无误。应检查是否有拼写错误、不必要的空格或额外的字符。应验证是否为适当的字段设置了条件,并且是希望记录应符合的条件。如果在查询设计网格的“或”行或在使用Or运算符的条件表达式中使用了其他条件,则可能要将其删除。请检查要查找的数据。如果该数据包含多余的空格或其他特殊字符,那么条件也会将这些内容算在内。如果无法确定或不想指定准确的字段值,则可以在条件中使用通配符。如果已经使用通配符,但没有得到所需的结果,则有可能将通配符用在了错误的数据类型上。在选择查询、追加查询或生成表查询中,如果使用查询“设计”视图中工具栏上的“上限值”(或在查询属性表中设置“上限值”属性),以返回字段中指定个数的最大值或最小值,查询返回的记录数可能比指定的要多。这是因为,所有与最后一条记录匹配的记录也同时返回。因此,即便只要求查看销售额最高和其次的雇员,查询也会同时返回以下三条记录,因为查询不知道如何区分都为 50,000 的销售额。
雇员ID销售额
如果希望返回值中不含重复的记录,请在查询属性表中将“唯一值”属性设为“是”。
记录不足。
如果查询包括多个表或查询,请检查每条联接线的联接属性。联接属性决定了表或查询是联接其全部记录,还是只联接与其他表的记录相匹配的记录。
如果所用的联接类型只检索两个联接表中匹配的记录,则只要记录的联接字段中包含Null值,该记录就不包含在查询结果中。可以用Nz函数将Null值转换为零、零长度字符串或其他特定的值,这样就可以将这些记录包含到查询结果中。如果已指定条件,其限制可能过于严格。例如,如果在两个不同字段的“条件”行中指定了条件,那么对一条记录而言,两个条件必须都为真才能使查询检索到它。此时可能需要删除部分或全部的条件,以使查询返回更多的记录。如果输入了组合两个或两个以上表达式的条件,这些表达式通过在多个条件行上的“或”运算符连接,则必须在所用的每个条件行的其他字段中重复任何其他表达式,以便使这些其他表达式应用于所有条件。例如,如果 ShipCountry 字段的组合条件是 "Canada" OR "UK",并且希望将 ExtendedPrice 字段限制为对于两个国家/地区均为 &10000,请在一个条件行上输入所有条件,或对所用的每个条件行重复 &10000 表达式。请验证现有条件是否已正确输入。应检查拼写错误、不必要的空格或多余的字符。验证是否为适当的字段设置了条件,并且是记录应符合的条件。如果字段名包含冒号,在表达式中引用字段时,必须以方括号括住字段名。否则,Microsoft Access 会将字段名解释为字面文本值,因此不能检索所需的记录。如果无法确定或不想指定准确的字段值,则可以在条件中使用通配符。如果已经使用通配符,但没有得到所需的记录,则有可能将通配符用在了错误的数据类型上。添加其他条件,以选定要处理的记录。在查询设计网格的“或”行中,或在使用包含Or运算符的表达式的“条件”行中,就可以添加这样的条件。如果使用条件在一个或多个字段中选定包含特定值的记录,则在该字段中有Null值的记录并不符合这种值,因此不会包含在返回的记录中。如果要包括含Null值的记录,请在“或”行中键入Is Null。
记录是错误的。
检查要查找的数据。如果该数据包含多余的空格或其他特殊字符,那么条件也会将这些内容算在内。如果无法确定或不想指定准确的字段值,则可以在条件中使用通配符。如果已经使用通配符,但没有得到所需的结果,则有可能将通配符用在了错误的数据类型上。验证现有条件是否已正确输入。应检查拼写错误、不必要的空格或多余的字符。验证是否为适当的字段设置了条件,并且是记录应符合的条件。验证添加到查询“设计”视图上部的表和查询是否正确。
在其他 ANSI SQL 查询模式下运行查询。
您的查询是在其他ANSI SQL 查询模式中而非Microsoft Access 数据库的当前模式中创建的。
为什么应避免将在不同 ANSI SQL 查询模式中创建的查询混合在一起
两种ANSI SQL 查询模式(即 ANSI-89 和 ANSI-92)并不兼容。在创建Microsoft Access 数据库时,需要确定将要使用何种查询模式,因为混合在不同查询模式下创建的查询可能会发生运行时错误或意想不到的结果。数据类型、保留字和通配符的范围在每种查询模式下都是不同的。
有关用通配符进行查询的示例
如果一个查询在条件表达式中使用了通配符,则在每种查询模式下会产生不同的结果。例如,如果:
在设为 ANSI-92 查询模式的数据库中运行 ANSI-89 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U*'
它返回来自名为“U*”的国家/地区的所有客户,而不是所有以字母“U”打头的国家/地区,因为星号 (*) 在 ANSI-92 SQL 中不是通配符。在设为 ANSI-89 查询模式的数据库中运行 ANSI-92 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U%'
将返回国家/地区名为“U%”的所有客户,而不是返回国家/地区名以“U”打头的所有客户,因为百分号 (%) 不是 ANSI-89 SQL 中的通配符。
有关具有重复字段和别名的查询的示例
如果一个查询使用了与基础列同名的别名,并且使用不明确的名称创建计算字段,则在不同的查询模式下进行查询时会产生不同的结果。例如,如果运行以下查询:
SELECT Orders.OrderID AS Freight, Orders.Freight, [Freight]*1.1 AS [New Freight] FROM O
在 ANSI-92 SQL 下,Access 用 Freight 字段计算 New Freight 值,于是每个 Freight 值增加 10%。在 ANSI-89 SQL 下,Access 用 Freight 别名计算 New Freight 值,于是每个 OrderID 值增加 10%。
如何避免因在同一数据库中混合了在不同 ANST SQL 查询模式下创建的查询而导致的问题?
通常,为防止由于混合在不同 ANSI SQL 查询模式下创建的查询所导致的问题,应该避免下列操作:
将设为 ANSI-92 SQL 查询模式的 Access 数据库,从 2002 - 2003 文件格式转换为 2000 或 97 文件格式。只有 2002 - 2003 文件格式支持 ANSI-92 SQL 查询模式。创建了一个或多个查询后,更改当前数据库的 ANSI-92 SQL 查询模式。如果必须这样做,应再次测试现有查询以确保其仍然正常运行或产生预期的结果,必要时重写查询。将创建于一种 ANSI SQL 查询模式下的查询导入到设置为另一种模式的 Access 数据库中,或者将创建于一种 ANSI SQL 查询模式下的查询导出到设为另一种模式的 Access 数据库中。在现有应用程序中更改 ANSI SQL 查询模式。这样做将会中断您的应用程序,并需要重写应用程序。
在 Access 2000 中,只能以编程方式来更改 ANST SQL 查询模式,任何在 ANST-92 查询模式下创建的查询在“数据库”窗口中都被隐藏。在 Access 2002 或更高版本中,您或用户可以通过用户界面来更改 ANST SQL 查询模式,ANSI-92 查询不再在“数据库”窗口中隐藏。因此,应通过帮助保护代码并阻止通过应用程序的用户界面更改查询模式,防止对应用程序的 ANST SQL 查询模式无意或有意的更改。使用不明确的别名和列名。为了避免混乱,应确保别名和列名在一个 SQL 语句中始终是唯一的。
未得到想要的列。
在查询设计网格中移除不希望在查询结果中看到的字段。如果已将星号 (*) 添加到设计网格,则删除星号。星号会自动包含基表的所有字段。如果想保留星号 (*),请清除星号以外的所有字段的“显示”复选框;否则,这些字段将在查询结果中出现两次。隐藏不需要在查询结果中显示的字段。确认“输出所有字段”复选框没有被选中。(若要查看它是否已选中,请在“工具”菜单上单击“选项”,然后单击“表/查询”选项卡。)如果已选中,则无须添加到查询设计网格、基表或查询的所有字段就会都显示在查询结果中。如果后来将字段添至设计网格,比如为了设置条件,则需要清除该字段的“显示”复选框,否则,字段在查询的结果中将显示两次。如果需要,请清除“输出所有字段”复选框。更改该选项仅影响所创建的新查询的属性设置,不影响已有的查询。
将更多字段添加到查询设计网格,或者,如果将星号添加到设计网格,查询将自动地包含基表或查询的所有字段。添加其他表或查询,然后添加其他需要的字段。显示隐藏字段。如果未选中“输出所有字段”复选框,将只检索设计网格中的字段。(若要查看该复选框是否已选中,请在“工具”菜单上单击“选项”,然后单击“表/查询”选项卡。)如果已选中,则无须添加到查询设计网格、基表或查询的所有字段就会都显示在查询结果中。如果后来将字段添至设计网格,例如为了设置条件,则需要清除该字段的“显示”复选框;否则,字段在查询的结果中将显示两次。或者,如果需要,请清除“输出所有字段”复选框。更改该选项仅影响所创建的新查询的属性设置,不影响已有的查询。
列是错误的。
在查询设计网格中,移除不希望查询检索的字段。如果列丢失,则将其字段添至查询设计网格。确认是由正确的表和查询检索记录。
在其他 ANSI SQL 查询模式下运行查询。
您的查询是在其他ANSI SQL 查询模式中而非Microsoft Access 数据库的当前模式中创建的。
为什么应避免将在不同 ANSI SQL 查询模式中创建的查询混合在一起
两种ANSI SQL 查询模式(即 ANSI-89 和 ANSI-92)并不兼容。在创建Microsoft Access 数据库时,需要确定将要使用何种查询模式,因为混合在不同查询模式下创建的查询可能会发生运行时错误或意想不到的结果。数据类型、保留字和通配符的范围在每种查询模式下都是不同的。
有关用通配符进行查询的示例
如果一个查询在条件表达式中使用了通配符,则在每种查询模式下会产生不同的结果。例如,如果:
在设为 ANSI-92 查询模式的数据库中运行 ANSI-89 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U*'
将返回国家/地区名为“U*”的所有客户,而不是返回国家/地区名以“U”打头的所有客户,因为星号 (*) 不是 ANSI-92 SQL 中的通配符。在设为 ANSI-89 查询模式的数据库中运行 ANSI-92 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U%'
将返回国家/地区名为“U%”的所有客户,而不是返回国家/地区名以“U”打头的所有客户,因为百分号 (%) 不是 ANSI-89 SQL 中的通配符。
有关具有重复字段和别名的查询的示例
如果一个查询使用了与基础列同名的别名,并且使用不明确的名称创建计算字段,则在不同的查询模式下进行查询时会产生不同的结果。例如,如果运行以下查询:
SELECT Orders.OrderID AS Freight, Orders.Freight, [Freight]*1.1 AS [New Freight] FROM O
在 ANSI-92 SQL 下,Access 用 Freight 字段计算 New Freight 值,于是每个 Freight 值增加 10%。在 ANSI-89 SQL 下,Access 用 Freight 别名计算 New Freight 值,于是每个 OrderID 值增加 10%。
如何避免因在同一数据库中混合了在不同 ANST SQL 查询模式下创建的查询而导致的问题?
通常,为防止由于混合在不同 ANSI SQL 查询模式下创建的查询所导致的问题,应该避免下列操作:
将设为 ANSI-92 SQL 查询模式的 Access 数据库,从 2002 - 2003 文件格式转换为 2000 或 97 文件格式。只有 2002 - 2003 文件格式支持 ANSI-92 SQL 查询模式。创建了一个或多个查询后,更改当前数据库的 ANSI-92 SQL 查询模式。如果必须这样做,应再次测试现有查询以确保其仍然正常运行或产生预期的结果,必要时重写查询。将创建于一种 ANSI SQL 查询模式下的查询导入到设置为另一种模式的 Access 数据库中,或者将创建于一种 ANSI SQL 查询模式下的查询导出到设为另一种模式的 Access 数据库中。在现有应用程序中更改 ANSI SQL 查询模式。这样做将会中断您的应用程序,并需要重写应用程序。
在 Access 2000 中,只能以编程方式来更改 ANST SQL 查询模式,任何在 ANST-92 查询模式下创建的查询在“数据库”窗口中都被隐藏。在 Access 2002 或更高版本中,您或用户可以通过用户界面来更改 ANST SQL 查询模式,ANSI-92 查询不再在“数据库”窗口中隐藏。因此,应通过帮助保护代码并阻止通过应用程序的用户界面更改查询模式,防止对应用程序的 ANST SQL 查询模式无意或有意的更改。使用不明确的别名和列名。为了避免混乱,应确保别名和列名在一个 SQL 语句中始终是唯一的。
没有得到预期的计算结果。
总计(聚合)计算的结果是错误的。
如果在计算的字段中,有记录是Null(空)值,则这些记录将不包括在计算之中。如果查询不是在正确的组中执行计算,应确保对于要用于分组计算的字段,“总计”单元格中包含“分组依据”设置。同样,查询设计网格中指定条件的位置,决定了是否在对查询进行分组或执行计算前排除记录,是否在执行计算前排除组,或者是否在运行计算之后排除某些结果。在交叉表查询中,可能有太多或太少“分组依据”字段。请添加、删除或更改作为垂直分组总计的行标题的字段。请确认使用了正确的字段值作为水平分组总计的列标题。确认所选择的聚合函数是正确的。如果不是,请从“总计”单元格的列表中选择其他聚合函数。
总计(聚合)函数计算结果位于错误的列中。
在查询设计网格之中,删除在该字段(列)的“总计”单元格中指定的聚合,然后在其他字段中选择一个。
设计网格中的算术计算返回Null(空)值。
如果在表达式中使用算术运算符(诸如,+,-,*,/),例如,UnitsInStock] + [UnitsOnOrder],并且在表达式中的一个字段包含一个Null值,那么整个表达式的结果将为Null值。若要避免这一点,可以通过使用Nz函数将Null值转换为零或其他数字。
在其他 ANSI SQL 查询模式下运行查询。
您的查询是在其他ANSI SQL 查询模式中而非Microsoft Access 数据库的当前模式中创建的。
为什么应避免将在不同 ANSI SQL 查询模式中创建的查询混合在一起
两种ANSI SQL 查询模式(即 ANSI-89 和 ANSI-92)并不兼容。在创建Microsoft Access 数据库时,需要确定将要使用何种查询模式,因为混合在不同查询模式下创建的查询可能会发生运行时错误或意想不到的结果。数据类型、保留字和通配符的范围在每种查询模式下都是不同的。
有关用通配符进行查询的示例
如果一个查询在条件表达式中使用了通配符,则在每种查询模式下会产生不同的结果。例如,如果:
在设为 ANSI-92 查询模式的数据库中运行 ANSI-89 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U*'
将返回国家/地区名为“U*”的所有客户,而不是返回国家/地区名以“U”打头的所有客户,因为星号 (*) 不是 ANSI-92 SQL 中的通配符。在设为 ANSI-89 查询模式的数据库中运行 ANSI-92 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U%'
将返回国家/地区名为“U%”的所有客户,而不是返回国家/地区名以“U”打头的所有客户,因为百分号 (%) 不是 ANSI-89 SQL 中的通配符。
有关具有重复字段和别名的查询的示例
如果一个查询使用了与基础列同名的别名,并且使用不明确的名称创建计算字段,则在不同的查询模式下进行查询时会产生不同的结果。例如,如果运行以下查询:
SELECT Orders.OrderID AS Freight, Orders.Freight, [Freight]*1.1 AS [New Freight] FROM O
在 ANSI-92 SQL 下,Access 用 Freight 字段计算 New Freight 值,于是每个 Freight 值增加 10%。在 ANSI-89 SQL 下,Access 用 Freight 别名计算 New Freight 值,于是每个 OrderID 值增加 10%。
如何避免因在同一数据库中混合了在不同 ANST SQL 查询模式下创建的查询而导致的问题?
通常,为防止由于混合在不同 ANSI SQL 查询模式下创建的查询所导致的问题,应该避免下列操作:
将设为 ANSI-92 SQL 查询模式的 Access 数据库,从
文件格式转换为 2000 或 97 文件格式。只有 2002 - 2003 文件格式支持 ANSI-92 SQL 查询模式。创建了一个或多个查询后,更改当前数据库的 ANSI-92 SQL 查询模式。如果必须这样做,应再次测试现有查询以确保其仍然正常运行或产生预期的结果,必要时重写查询。将创建于一种 ANSI SQL 查询模式下的查询导入到设置为另一种模式的 Access 数据库中,或者将创建于一种 ANSI SQL 查询模式下的查询导出到设为另一种模式的 Access 数据库中。在现有应用程序中更改 ANSI SQL 查询模式。这样做将会中断您的应用程序,并需要重写应用程序。
在 Access 2000 中,只能以编程方式来更改 ANST SQL 查询模式,任何在 ANST-92 查询模式下创建的查询在“数据库”窗口中都被隐藏。在 Access 2002 或更高版本中,您或用户可以通过用户界面来更改 ANST SQL 查询模式,ANSI-92 查询不再在“数据库”窗口中隐藏。因此,应通过帮助保护代码并阻止通过应用程序的用户界面更改查询模式,防止对应用程序的 ANST SQL 查询模式无意或有意的更改。使用不明确的别名和列名。为了避免混乱,应确保别名和列名在一个 SQL 语句中始终是唯一的。
特定类型的查询
“自动查阅”查询没有填入数据。
要正确执行“自动查阅”查询,必须符合某些特定条件:
查询必须以多个表为基础,并且这些表必须具有一对多关系。(不一定要实施参照完整性)。联接字段在“一”方必须是唯一索引。唯一索引意味着该字段是主键或者在表的“设计”视图中其“索引”属性被设置为“有(无重复)”。添加到设计网格的联接字段必须是来自位于一对多关系的“多”方的表。(换句话说,也就是那个表的外键)。要执行“自动查阅”,联接字段不能是主键并且其“索引”属性不能设置为“有(无重复)”。例如,在一个包含“客户”表和“订单”表的查询中,应该从“订单”表中将“客户ID”字段拖到设计网格中,而不是从“客户”表中进行拖动。在“多”方的联接字段中输入的值必须已经存在于“一”方的联接字段中。
Microsoft Access 自动联接了不需要联接的表或查询。
即使没有在表之间建立关系,如果添加到查询中的两个表都含有一个相同数据类型或兼容数据类型的字段,并且这两个联接字段中有一个是主键,Microsoft Access 将自动为其创建联接。可以启用或禁用这些自动联接。
在“工具”菜单上,单击“选项”。单击“表/查询”选项卡。选中或清除“启用自动联接功能”复选框。
注释该设置只应用于新建的查询。
无法通过查询更新数据。
在某些情况下,可以在查询“数据表”视图中编辑数据以更改基表中的数据。而在另一些情况下则不行。下面的信息表明了各种查询的结果是否能更新;如果不能,是否有其他的方法可以替代。
数据可更新
下列情况下可以更新查询或查询字段:
基于一个表的查询基于具有一对一关系的表的查询查询的结果中包含“备注”、“超链接”或“OLE 对象”
数据在一定条件下可更新
如果查询基于含有一对多关系的表,则不能编辑下列查询字段的数据。
查询字段解决方案
位于“一”方的联接字段启动两表之间的级联更新。
新记录,如果位于“多”方的联接字段不出现在数据表中从“多”方将联接字段添加到查询中,以允许添加新记录。
在“一”方更新数据后,来自“多”方的联接字段先保存记录;然后可以对“多”方的联接字段进行更改。
在存在外部联接的一对多关系的“一”方表中的空白字段在位于“多”方的表的字段中输入值,但必要条件是位于“一”方的联接字段中包含该记录的值。
新记录,如果ODBC表的整个唯一键没有输出选取 ODBC 表的所有主键字段,以允许向其中插入数据。
数据可以删除但不能更新
查询或查询字段解决方案
不具有“更新数据”权限的查询(或基表)若要修改数据,必须指定相应的权限。
不具有“删除数据”权限的查询(或基表)若要删除数据,必须指定相应的权限。?
数据不能更新
查询或查询字段解决方案
基于具有多对一对多关系的三个或更多表的查询。当窗体的“记录集类型”属性设置为“动态集(不一致的更新)”时,虽然不能直接更新查询中的数据,但可以更新基于该查询的窗体或数据访问页中的数据。
交叉表查询?无
SQL传递查询?无
对字段求和、平均值、计数值或其他类型总和值的查询,或者从包含总和或合计函数的交叉表查询、选择查询或子查询的“更新到”行中引用字段的更新查询通过在更新查询的“更新到”行中使用域聚合函数,可以引用包含总计或聚合函数的交叉表查询、选择查询或子查询中的字段。
联合查询?无
“唯一值”属性设置为“是”的查询?无
包含无唯一索引的ODBC链接表或无主键的 Paradox 表的查询?无
包含多个表或查询,并且这些表或查询在“设计”视图中没有使用联接线相联接的查询若要更新表,必须正确地联接它们。
计算字段?无
字段为只读;数据库是以只读方式打开或位于只读驱动器上?无
记录中的字段已经删除或被其他用户锁定锁定的记录在解锁后即可更新。
不希望有提示时,却出现了参数的提示。
如果在试图运行查询、报表或数据访问页时,出现了并不希望的类型参数提示,可能是以下原因之一:
已经从查询设计网格中删除了参数,但没有在“查询参数”对话框中删除参数。在查询、报表或数据访问页中对字段进行重新命名或拼错了字段,但在查询的基表中并未重命名或拼错该字段。某个字段引用了计算字段。如果查询中某个字段基于计算值进行计算,请确保已选中查询设计网格中计算字段的“显示”复选框。
在其他 ANSI SQL 查询模式下运行查询。
您的查询是在其他ANSI SQL 查询模式中而非Microsoft Access 数据库的当前模式中创建的。
为什么应避免将在不同 ANSI SQL 查询模式中创建的查询混合在一起
两种ANSI SQL 查询模式(即 ANSI-89 和 ANSI-92)并不兼容。在创建Microsoft Access 数据库时,需要确定将要使用何种查询模式,因为混合在不同查询模式下创建的查询可能会发生运行时错误或意想不到的结果。数据类型、保留字和通配符的范围在每种查询模式下都是不同的。
有关用通配符进行查询的示例
如果一个查询在条件表达式中使用了通配符,则在每种查询模式下会产生不同的结果。例如,如果:
在设为 ANSI-92 查询模式的数据库中运行 ANSI-89 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U*'
将返回国家/地区名为“U*”的所有客户,而不是返回国家/地区名以“U”打头的所有客户,因为星号 (*) 不是 ANSI-92 SQL 中的通配符。在设为 ANSI-89 查询模式的数据库中运行 ANSI-92 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U%'
将返回国家/地区名为“U%”的所有客户,而不是返回国家/地区名以“U”打头的所有客户,因为百分号 (%) 不是 ANSI-89 SQL 中的通配符。
有关具有重复字段和别名的查询的示例
如果一个查询使用了与基础列同名的别名,并且使用不明确的名称创建计算字段,则在不同的查询模式下进行查询时会产生不同的结果。例如,如果运行以下查询:
SELECT Orders.OrderID AS Freight, Orders.Freight, [Freight]*1.1 AS [New Freight] FROM O
在 ANSI-92 SQL 下,Access 用 Freight 字段计算 New Freight 值,于是每个 Freight 值增加 10%。在 ANSI-89 SQL 下,Access 用 Freight 别名计算 New Freight 值,于是每个 OrderID 值增加 10%。
如何避免因在同一数据库中混合了在不同 ANST SQL 查询模式下创建的查询而导致的问题?
通常,为防止由于混合在不同 ANSI SQL 查询模式下创建的查询所导致的问题,应该避免下列操作:
将设为 ANSI-92 SQL 查询模式的 Access 数据库,从 2002 - 2003 文件格式转换为 2000 或 97 文件格式。只有 2002 - 2003 文件格式支持 ANSI-92 SQL 查询模式。创建了一个或多个查询后,更改当前数据库的 ANSI-92 SQL 查询模式。如果必须这样做,应再次测试现有查询以确保其仍然正常运行或产生预期的结果,必要时重写查询。将创建于一种 ANSI SQL 查询模式下的查询导入到设置为另一种模式的 Access 数据库中,或者将创建于一种 ANSI SQL 查询模式下的查询导出到设为另一种模式的 Access 数据库中。在现有应用程序中更改 ANSI SQL 查询模式。这样做将会中断您的应用程序,并需要重写应用程序。
在 Access 2000 中,只能以编程方式来更改 ANST SQL 查询模式,任何在 ANST-92 查询模式下创建的查询在“数据库”窗口中都被隐藏。在 Access 2002 或更高版本中,您或用户可以通过用户界面来更改 ANST SQL 查询模式,ANSI-92 查询不再在“数据库”窗口中隐藏。因此,应通过帮助保护代码并阻止通过应用程序的用户界面更改查询模式,防止对应用程序的 ANST SQL 查询模式无意或有意的更改。使用不明确的别名和列名。为了避免混乱,应确保别名和列名在一个 SQL 语句中始终是唯一的。
不希望有提示时,却出现了参数的提示。
如果在试图运行查询、报表或数据访问页时,出现了并不希望的类型参数提示,可能是以下原因之一:
已经从查询设计网格中删除了参数,但没有在“查询参数”对话框中删除参数。在查询、报表或数据访问页中对字段进行重新命名或拼错了字段,但在查询的基表中并未重命名或拼错该字段。某个字段引用了计算字段。如果查询中某个字段基于计算值进行计算,请确保已选中查询设计网格中计算字段的“显示”复选框。
需要能够用参数查询返回所有记录的选项。
在设计网格中,包含“条件”单元格提示的字段下,将 [prompt]Is Null键入到“或”单元格中,其中 prompt 与“条件”单元格中该字段的提示相同。例如:
单元格键入
条件Like [Enter Category ID:]
或[Enter Category ID:] Is Null
运行查询。在 Microsoft Access 提示时,将“输入参数值”对话框留空。
在其他 ANSI SQL 查询模式下运行查询。
您的查询是在其他ANSI SQL 查询模式中而非Microsoft Access 数据库的当前模式中创建的。
为什么应避免将在不同 ANSI SQL 查询模式中创建的查询混合在一起
两种ANSI SQL 查询模式(即 ANSI-89 和 ANSI-92)并不兼容。在创建Microsoft Access 数据库时,需要确定将要使用何种查询模式,因为混合在不同查询模式下创建的查询可能会发生运行时错误或意想不到的结果。数据类型、保留字和通配符的范围在每种查询模式下都是不同的。
有关用通配符进行查询的示例
如果一个查询在条件表达式中使用了通配符,则在每种查询模式下会产生不同的结果。例如,如果:
在设为 ANSI-92 查询模式的数据库中运行 ANSI-89 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U*'
将返回国家/地区名为“U*”的所有客户,而不是返回国家/地区名以“U”打头的所有客户,因为星号 (*) 不是 ANSI-92 SQL 中的通配符。在设为 ANSI-89 查询模式的数据库中运行 ANSI-92 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U%'
将返回国家/地区名为“U%”的所有客户,而不是返回国家/地区名以“U”打头的所有客户,因为百分号 (%) 不是 ANSI-89 SQL 中的通配符。
有关具有重复字段和别名的查询的示例
如果一个查询使用了与基础列同名的别名,并且使用不明确的名称创建计算字段,则在不同的查询模式下进行查询时会产生不同的结果。例如,如果运行以下查询:
SELECT Orders.OrderID AS Freight, Orders.Freight, [Freight]*1.1 AS [New Freight] FROM O
在 ANSI-92 SQL 下,Access 用 Freight 字段计算 New Freight 值,于是每个 Freight 值增加 10%。在 ANSI-89 SQL 下,Access 用 Freight 别名计算 New Freight 值,于是每个 OrderID 值增加 10%。
如何避免因在同一数据库中混合了在不同 ANST SQL 查询模式下创建的查询而导致的问题?
通常,为防止由于混合在不同 ANSI SQL 查询模式下创建的查询所导致的问题,应该避免下列操作:
将设为 ANSI-92 SQL 查询模式的 Access 数据库,从 2002 - 2003 文件格式转换为 2000 或 97 文件格式。只有 2002 - 2003 文件格式支持 ANSI-92 SQL 查询模式。创建了一个或多个查询后,更改当前数据库的 ANSI-92 SQL 查询模式。如果必须这样做,应再次测试现有查询以确保其仍然正常运行或产生预期的结果,必要时重写查询。将创建于一种 ANSI SQL 查询模式下的查询导入到设置为另一种模式的 Access 数据库中,或者将创建于一种 ANSI SQL 查询模式下的查询导出到设为另一种模式的 Access 数据库中。在现有应用程序中更改 ANSI SQL 查询模式。这样做将会中断您的应用程序,并需要重写应用程序。
在 Access 2000 中,只能以编程方式来更改 ANST SQL 查询模式,任何在 ANST-92 查询模式下创建的查询在“数据库”窗口中都被隐藏。在 Access 2002 或更高版本中,您或用户可以通过用户界面来更改 ANST SQL 查询模式,ANSI-92 查询不再在“数据库”窗口中隐藏。因此,应通过帮助保护代码并阻止通过应用程序的用户界面更改查询模式,防止对应用程序的 ANST SQL 查询模式无意或有意的更改。使用不明确的别名和列名。为了避免混乱,应确保别名和列名在一个 SQL 语句中始终是唯一的。
交叉表查询
列标题顺序不对,或需要排除一些列标题。
可以设置查询的“列标题”属性,来指定要显示哪些列标题、以什么顺序显示它们。
无法更新交叉表查询中的数据。
交叉表查询中的数据是不可更新的。
在查询的结果中,一个或多个列标题被标记为“&&”。
只要“交叉表”单元格的“列标题”中的字段值为Null,Microsoft Access 就返回“&&”作为列名称。如果要避免这样,可以:
通过设置查询的“列标题”属性,明确地定义列标题。
排序或限制显示在交叉表查询中的列标题
可以更改交叉表查询中的顺序或限制列标题。例如,在包含各个月份的列标题中,可以使月份按时间排序,而不是按字母顺序。也可以限制为从一月到六月的列。
在“设计”视图中打开交叉表查询。在设计网格和字段列表之外,单击查询“设计”视图的背景。在工具栏上,单击“属性”以显示查询的属性表。在“列标题”属性框中,按希望的显示顺序输入要显示的列标题。在列标题之间,请键入逗号或适合自己国家/地区(有关国家/地区的列表分隔符的内容,请查看 Windows“控制面板”中的“区域设置”)的分隔符。
输入的列标题必须与查询数据表的列标题完全相符。例如,如果数据表中的列标题是“USA”,则必须输入“USA”作为列标题,而不是“US”(按 Enter 或者将指针移动到其他位置之后,Microsoft Access 会将每个列标题用引号括起来)。要查看查询结果,可单击工具栏上的“视图”。
如果需要经常运行交叉表查询,或者将它用作窗体、报表或数据访问页的基础查询,用上述过程指定固定的列标题可以加快查询的运行速度。如果在不同的查询中频繁地使用相同的列标题,考虑创建带有一个文本字段的表以存储列标题。需要时请打开该表并将标题复制到“列标题”框中。
在设计网格中,在赋值的“列标题”字段的“条件”单元格中,键入Is Not Null。在赋值的“列标题”字段的“条件”单元格中,在表达式中使用Nz函数,将Null值转换为其他更有意义的值,例如“未知”。
错误的字段值显示为行标题或列标题。
确认字段值要用作列标题的字段,的确位于查询设计网格中,且“交叉表”单元格是“列标题”,而且字段值要用作行标题的字段的确位于查询设计网格中,且“交叉表”单元格是“行标题”。如果要改变“交叉表”单元格中的值,请单击单元格,然后从列表中单击一个值。如果只要将特定值显示为列标题,请设置查询的“标题”属性。
排序或限制交叉表查询中显示的列标题
可以更改交叉表查询中的顺序或限制列标题。例如,在包含各个月份的列标题中,可以使月份按时间排序,而不是按字母顺序。也可以限制为从一月到六月的列。
在“设计”视图中打开交叉表查询。在设计网格和字段列表之外,单击查询“设计”视图的背景。在工具栏上,单击“属性”以显示查询的属性表。在“列标题”属性框中,按希望的显示顺序输入要显示的列标题。在列标题之间,请键入逗号或适合自己国家/地区(有关国家/地区的列表分隔符的内容,请查看 Windows“控制面板”中的“区域设置”)的分隔符。
输入的列标题必须与查询数据表的列标题完全相符。例如,如果数据表中的列标题是“USA”,则必须输入“USA”作为列标题,而不是“US”(按 Enter 或者将指针移动到其他位置之后,Microsoft Access 会将每个列标题用引号括起来)。要查看查询结果,可单击工具栏上的“视图”。
如果需要经常运行交叉表查询,或者将它用作窗体、报表或数据访问页的基础查询,用上述过程指定固定的列标题可以加快查询的运行速度。如果在不同的查询中频繁地使用相同的列标题,考虑创建带有一个文本字段的表以存储列标题。需要时请打开该表并将标题复制到“列标题”框中。
在其他 ANSI SQL 查询模式下运行查询。
您的查询是在其他ANSI SQL 查询模式中而非Microsoft Access 数据库的当前模式中创建的。
为什么应避免将在不同 ANSI SQL 查询模式中创建的查询混合在一起
两种ANSI SQL 查询模式(即 ANSI-89 和 ANSI-92)并不兼容。在创建Microsoft Access 数据库时,需要确定将要使用何种查询模式,因为混合在不同查询模式下创建的查询可能会发生运行时错误或意想不到的结果。数据类型、保留字和通配符的范围在每种查询模式下都是不同的。
有关用通配符进行查询的示例
如果一个查询在条件表达式中使用了通配符,则在每种查询模式下会产生不同的结果。例如,如果:
在设为 ANSI-92 查询模式的数据库中运行 ANSI-89 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U*'
将返回国家/地区名为“U*”的所有客户,而不是返回国家/地区名以“U”打头的所有客户,因为星号 (*) 不是 ANSI-92 SQL 中的通配符。在设为 ANSI-89 查询模式的数据库中运行 ANSI-92 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U%'
将返回国家/地区名为“U%”的所有客户,而不是返回国家/地区名以“U”打头的所有客户,因为百分号 (%) 不是 ANSI-89 SQL 中的通配符。
有关具有重复字段和别名的查询的示例
如果一个查询使用了与基础列同名的别名,并且使用不明确的名称创建计算字段,则在不同的查询模式下进行查询时会产生不同的结果。例如,如果运行以下查询:
SELECT Orders.OrderID AS Freight, Orders.Freight, [Freight]*1.1 AS [New Freight] FROM O
在 ANSI-92 SQL 下,Access 用 Freight 字段计算 New Freight 值,于是每个 Freight 值增加 10%。在 ANSI-89 SQL 下,Access 用 Freight 别名计算 New Freight 值,于是每个 OrderID 值增加 10%。
如何避免因在同一数据库中混合了在不同 ANST SQL 查询模式下创建的查询而导致的问题?
通常,为防止由于混合在不同 ANSI SQL 查询模式下创建的查询所导致的问题,应该避免下列操作:
将设为 ANSI-92 SQL 查询模式的 Access 数据库,从 2002 - 2003 文件格式转换为 2000 或 97 文件格式。只有 2002 - 2003 文件格式支持 ANSI-92 SQL 查询模式。创建了一个或多个查询后,更改当前数据库的 ANSI-92 SQL 查询模式。如果必须这样做,应再次测试现有查询以确保其仍然正常运行或产生预期的结果,必要时重写查询。将创建于一种 ANSI SQL 查询模式下的查询导入到设置为另一种模式的 Access 数据库中,或者将创建于一种 ANSI SQL 查询模式下的查询导出到设为另一种模式的 Access 数据库中。在现有应用程序中更改 ANSI SQL 查询模式。这样做将会中断您的应用程序,并需要重写应用程序。
在 Access 2000 中,只能以编程方式来更改 ANST SQL 查询模式,任何在 ANST-92 查询模式下创建的查询在“数据库”窗口中都被隐藏。在 Access 2002 或更高版本中,您或用户可以通过用户界面来更改 ANST SQL 查询模式,ANSI-92 查询不再在“数据库”窗口中隐藏。因此,应通过帮助保护代码并阻止通过应用程序的用户界面更改查询模式,防止对应用程序的 ANST SQL 查询模式无意或有意的更改。使用不明确的别名和列名。为了避免混乱,应确保别名和列名在一个 SQL 语句中始终是唯一的。
操作查询(追加、更新、删除)
追加查询追加数据的目标字段或源字段不对。
请确认为想要追加的数据选择了正确的字段,在查询设计网格中输入了正确的条件,并且正确地选择了想要追加数据的字段。如果有可用的备份副本,则通过该副本将追加查询恢复为原状态,然后执行下列一项或多项操作:
选定要为其追加数据的字段
在查询设计网格中为追加查询添加下列字段:
要追加的字段。要为其指定条件的字段。与要向其中追加记录的表的主键字段相对应的字段。
选定要为其追加数据的字段
在要追加数据的目标字段的“追加到”单元格中,单击要添加数据的字段名。
注释如果要在“字段”单元格中添加星号 (*),请在“追加到”单元格中选定星号。两个表中的所有字段名都必须完全相同。不能在包含星号的字段中指定选定记录的条件,但是可以在单独的列中指定条件。
更新查询不能执行所需的更新。
需要通过更改“更新到”单元格中的表达式来指定不同的更新。例如,如果要提高百分之五的工资,请在“工资”字段的“更新到”单元格中键入“[工资]*1.05”。请确认在正确的字段中更新数据。如果更新的是错误字段中的数据,请指定另一个字段的更新。若要指定字段的更新,请在“更新到”单元格中键入相应的表达式。
在使用“查找重复项向导”之后,不知道删除重复记录的最好方法。
直接在查询“数据表”视图中删除重复的记录或原始记录。
在数据表或窗体中删除记录
打开数据表,或在“窗体”视图中打开窗体。单击要删除的记录。单击工具栏上的“删除记录”。
注释删除数据时可能需要同时删除其他表中的相关数据。例如,如果删除了某个供应商,则可能还要删除该供应商所提供的产品。在某些情况下,通过实施参照完整性并启用级联删除,可以确保删除合适的数据。
在数据访问页中删除记录
要点删除记录后,无法从数据库中撤消删除操作。
在记录导航工具栏上,单击“删除”。
注释如果看不到“删除”按钮,可能是由于下列原因之一:
该页不支持删除。该页的设计者已对此按钮进行了自定义。请查阅有关如何使用页的说明,或是与设计者联系。
如果希望 Microsoft Access 自动删除全部重复记录并保存原始记录,则不要使用“查找重复项查询向导”,或将“查找重复项”查询转换为删除查询。
从表中删除重复记录
从表中删除重复记录需要两个步骤。第一步,创建包含重复项的表结构的副本,然后生成所有包含重复项的字段的主键;第二步,创建并执行由原始表到新表的追加查询。因为主键字段不能包含重复记录,所以此过程将生成一个不含重复记录的表。
复制表并生成包含重复项的字段的主键
操作方法:
在“数据库”窗口中,单击“对象”下的“表”。单击要删除重复记录的表名称。单击工具栏上的“复制”。单击工具栏上的“粘贴”。在“粘贴表方式”对话框中,键入复制表的名字,再单击“只粘贴结构”选项,然后单击“确定”按钮。在“设计”视图中打开新表,然后在复制的表中选择包含重复项的字段。单击工具栏上的“主键”按钮,以便根据选定的字段创建主键。保存并关闭表。
在新表中追加唯一值记录。
操作方法:
根据包含重复项的原始表新建一个查询。在查询“设计”视图中,单击工具栏上的“查询类型”,再单击“追加查询”。在“追加”对话框中,在“表名称”列表中单击新表的名称,然后单击“确定”。将星号 (*) 拖到查询设计网格,使新表包含原始表的所有字段。单击工具栏上的“运行”。收到追加行的信息时,请单击“是”按钮。收到 Microsoft Access 不能在追加查询中添加全部记录的信息时,请单击“是”按钮。这次仅将有唯一值的记录传送到新表中,并丢弃了重复项。打开表查看结果。确定新表有正确的唯一记录后,就可以删除原始表,然后使用原始表名来为新表重新命名。
删除查询从错误的表中删除了记录。
请确保删除查询包括:
要删除记录的表。从字段列表中将星号 (*) 拖拽到查询设计网格。要指定条件的字段。从表的字段列表中将所需的字段拖拽到设计网格中。
在查询设计网格中,在“删除”行中将显示From或Where,From显示在要删除其记录的表的“删除”单元格中,而Where显示在指定条件的字段的“删除”单元格中。
在其他 ANSI SQL 查询模式下运行查询。
您的查询是在其他ANSI SQL 查询模式中而非Microsoft Access 数据库的当前模式中创建的。
为什么应避免将在不同 ANSI SQL 查询模式中创建的查询混合在一起
两种ANSI SQL 查询模式(即 ANSI-89 和 ANSI-92)并不兼容。在创建Microsoft Access 数据库时,需要确定将要使用何种查询模式,因为混合在不同查询模式下创建的查询可能会发生运行时错误或意想不到的结果。数据类型、保留字和通配符的范围在每种查询模式下都是不同的。
有关用通配符进行查询的示例
如果一个查询在条件表达式中使用了通配符,则在每种查询模式下会产生不同的结果。例如,如果:
在设为 ANSI-92 查询模式的数据库中运行 ANSI-89 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U*'
将返回国家/地区名为“U*”的所有客户,而不是返回国家/地区名以“U”打头的所有客户,因为星号 (*) 不是 ANSI-92 SQL 中的通配符。在设为 ANSI-89 查询模式的数据库中运行 ANSI-92 SQL 查询,如:
SELECT * FROM Customers WHERE Country Like 'U%'
将返回国家/地区名为“U%”的所有客户,而不是返回国家/地区名以“U”打头的所有客户,因为百分号 (%) 不是 ANSI-89 SQL 中的通配符。
有关具有重复字段和别名的查询的示例
如果一个查询使用了与基础列同名的别名,并且使用不明确的名称创建计算字段,则在不同的查询模式下进行查询时会产生不同的结果。例如,如果运行以下查询:
SELECT Orders.OrderID AS Freight, Orders.Freight, [Freight]*1.1 AS [New Freight] FROM O
在 ANSI-92 SQL 下,Access 用 Freight 字段计算 New Freight 值,于是每个 Freight 值增加 10%。在 ANSI-89 SQL 下,Access 用 Freight 别名计算 New Freight 值,于是每个 OrderID 值增加 10%。
如何避免因在同一数据库中混合了在不同 ANST SQL 查询模式下创建的查询而导致的问题?
通常,为防止由于混合在不同 ANSI SQL 查询模式下创建的查询所导致的问题,应该避免下列操作:
将设为 ANSI-92 SQL 查询模式的 Access 数据库,从 2002 - 2003 文件格式转换为 2000 或 97 文件格式。只有 2002 - 2003 文件格式支持 ANSI-92 SQL 查询模式。创建了一个或多个查询后,更改当前数据库的 ANSI-92 SQL 查询模式。如果必须这样做,应再次测试现有查询以确保其仍然正常运行或产生预期的结果,必要时重写查询。将创建于一种 ANSI SQL 查询模式下的查询导入到设置为另一种模式的 Access 数据库中,或者将创建于一种 ANSI SQL 查询模式下的查询导出到设为另一种模式的 Access 数据库中。在现有应用程序中更改 ANSI SQL 查询模式。这样做将会中断您的应用程序,并需要重写应用程序。
在 Access 2000 中,只能以编程方式来更改 ANST SQL 查询模式,任何在 ANST-92 查询模式下创建的查询在“数据库”窗口中都被隐藏。在 Access 2002 或更高版本中,您或用户可以通过用户界面来更改 ANST SQL 查询模式,ANSI-92 查询不再在“数据库”窗口中隐藏。因此,应通过帮助保护代码并阻止通过应用程序的用户界面更改查询模式,防止对应用程序的 ANST SQL 查询模式无意或有意的更改。使用不明确的别名和列名。为了避免混乱,应确保别名和列名在一个 SQL 语句中始终是唯一的。
上页: 下页:
Access 2003完整教程:查询疑难解答 (MDB)
- 查询疑难解答 (MDB)
版权所有 &  证书:粤ICP备号

我要回帖

更多关于 库存量 的文章

 

随机推荐