access与sql查询语句转换注意事项

更新时间:2023-08-28 13:00:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

access与sql查询语句转换注意事项

1、--例 等待1 小时2 分零3 秒后才执行SELECT 语句

waitfor delay 01:02:03

select * from employee

2、--例 等到晚上11 点零8 分后才执行SELECT 语句

waitfor time 23:08:00

select * from employee

3、UPDATE语句对比:

SQLSERVER中更新多表的UPDATE语句:

UPDATE Tab1 SET http://www.77cn.com.cn = http://www.77cn.com.cn

FROM Tab1 a,Tab2 b

WHERE a.ID = b.ID;

同样功能的SQL语句在ACCESS中应该是

UPDATE Tab1 a,Tab2 b SET http://www.77cn.com.cn = http://www.77cn.com.cn

WHERE a.ID = b.ID;

即:ACCESS中的UPDATE语句没有FROM子句,所有引用的表都列在UPDATE关键字后.

上例中如果Tab2可以不是一个表,而是一个查询,例:

UPDATE Tab1 a,(Select ID,Name From Tab2) b

SET http://www.77cn.com.cn = http://www.77cn.com.cn

WHERE a.ID = b.ID;

4、访问多个不同的ACCESS数据库-在SQL中使用In子句:

Select a.*,b.* From Tab1 a,Tab2 b In @#db2.mdb@# Where a.ID=b.ID;

上面的SQL语句查询出当前数据库中Tab1和db2.mdb(当前文件夹中)中Tab2以ID为关联的所有记录.

缺点-外部数据库不能带密码.

5、在ACCESS中访问其它ODBC数据源

下例在ACCESS中查询SQLSERVER中的数据

SELECT * FROM Tab1 IN [ODBC]

[ODBC;Driver=SQL

Server;UID=sa;PWD=;Server=127.0.0.1;DataBase=Demo;] 外部数据源连接属性的完整参数是:

[ODBC;DRIVER=driver;SERVER=server;DATABASE=database;UID=user;PWD=password;]

其中的DRIVER=driver可以在注册表中的

HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\

access与sql查询语句转换注意事项

中找到

6、ACCESS支持子查询

ACCESS支持外连接,但不包括完整外部联接,如支持

LEFT JOIN 或 RIGHT JOIN

但不支持

FULL OUTER JOIN 或 FULL JOIN

7、ACCESS中的日期查询

注意:ACCESS中的日期时间分隔符是#而不是引号

Select * From Tab1 Where [Date]>#2002-1-1#;

在DELPHI中我这样用

SQL.Add(Format(

@#Select * From Tab1 Where [Date]>#%s#;@#,

[DateToStr(Date)]));

8、ACCESS中的字符串可以用双引号分隔,但SQLSERVER不认,所以为了迁移方便和兼容,建议用单引号作为字符串分隔符.

9、Access是一种桌面数据库,只适合数据量少的应用,在处理少量数据和单机访问的数据库时是很好的,效率也很高。但是它的同时访问客户端不能多于4个。access数据库有一定的极限,如果数据达到100M左右,很容易造成服务器iis假死,或者消耗掉服务器的内存导致服务器崩溃

10、Inser Into …..Select …From 语句:

在ACCESS中以下语句

INSERT INTO PubSubJectAccCopys(Copy_id,Acc_id,Acc_Pid,

Acc_name,acc_short,Acc_Comment,Acc_Pro,acc_type,Sub_id_flag,acc_index)

(SELECT 00201,Acc_id,Acc_Pid,Acc_name,acc_short,Acc_Comment, Acc_Pro,acc_type,Sub_id_flag,acc_index

FROM PubSubJectAcc WHERE PubSubJectAcc.co_type='03')

中后面"(select 200201******.co_Type='03')"中的小括号("(",")")必须去掉才能执行,如下:

INSERT INTO PubSubJectAccCopys(Copy_id,Acc_id,Acc_Pid,

Acc_name,acc_short,Acc_Comment,Acc_Pro,acc_type,Sub_id_flag,acc_index)

SELECT 200201,Acc_id,Acc_Pid,Acc_name,acc_short,Acc_Comment, Acc_Pro,acc_type,Sub_id_flag,acc_index

FROM PubSubJectAcc WHERE PubSubJectAcc.co_type='03'

access与sql查询语句转换注意事项

在SQL SERVER 中都可以

11、Inner Join 语句1

StrSql:='select http://www.77cn.com.cner_id,http://www.77cn.com.cner_opcode,b.copy_name from sysuser a inner join (syscopysuser c inner join syscopys b on c.copy_id=c.copy_id) on http://www.77cn.com.cner_id=http://www.77cn.com.cner_id

Where http://www.77cn.com.cner_opcode=''' +EdtUserOpCode.text+''' And copy_name='''+Tmpcopyname +'''';

应该改为

StrSql:='select http://www.77cn.com.cner_id,http://www.77cn.com.cner_opcode,b.copy_name from sysuser a inner join (syscopysuser c inner join syscopys b on c.copy_id=d.copy_id) on http://www.77cn.com.cner_id=http://www.77cn.com.cner_id

where http://www.77cn.com.cner_opcode=''' +EdtUserOpCode.text+''' And copy_name='''+Tmpcopyname +'''';

该行代码的检索条件错误:应该把C.copy_id=C.Copy_id 改为c.copy_id=d.copy_id

注:两种写法都能在SQL-SERVER中运行,但c.copy_id=C.copy_id在ACCESS中不能运行

12、 Inner Join 语句2

StrSql:='select copy_year,copy_name,a.copy_id from SysCopys a inner join SysCopysUser b on a.curcopy_flag=1 and a.copy_id=b.copy_id where http://www.77cn.com.cner_id=' + '''' +TmpPubUserID+ '''';

该为

StrSql:='select copy_year,copy_name,a.copy_id from SysCopys a inner join SysCopysUser b on a.copy_id=b.copy_id where a.curcopy_flag=''1'' and http://www.77cn.com.cner_id=' + '''' +TmpPubUserID+ '''';

注:两种写法都能在SQL-SERVER中运行,但第一种在ACCESS中不能运行

access与sql查询语句转换注意事项

13、 Inner Join语句3

SQl server 中可以执行以下语句

'SELECT distinct sysoption.opti_id,sysoption.opti_name,

sysoption.opti_code,sysroleoption.opti_sort

From sysoption inner join sysroleoption

ON sysoption.opti_id=sysroleoption.opti_id

AND sysroleoption.role_id=:roleid'

但ACCESS中不能,只能

'SELECT distinct sysoption.opti_id,sysoption.opti_name,

sysoption.opti_code,sysroleoption.opti_sort

From sysoption inner join sysroleoption

ON sysoption.opti_id=sysroleoption.opti_id

Where sysroleoption.role_id=:roleid'

查询第X页,每页Y条记录

最基本的处理方法(原理):

如果表中有主键(记录不重复的字段也可以),可以用类似下面的方法,当然y,(x-1)*y要换成具体的数字,不能用变量:

select top y * from 表 where 主键 not in(select top (x-1)*y 主键 from 表)

正点,就是这句话,立刻用上。

打印一下sql语句:SELECT TOP 20 * FROM tb_news WHERE nid NOT IN(SELECT TOP 0 nid FROM tb_news)

再打印结果数组, 返回结果为空,晕死。要是mysql就可以用phpmyadmin测试一下,但现在是access,找什么测试呀,算了,还是到群里问问,问了白问,不是不理我,就是说语句有问题。真是大哥来的,语句怎么会有问题的呢!!!汗一个

无耐之下,继续GG,无意之下,居然给我发现这么一个信息:

关于定义access分页的问题

如果为第一页

a=0

第二页 a=10

但是为何a=0不能辨认出来。而sqlserver可以。大家有其他方式来实现吗? 啊,原来真凶在这里,当第一页的时候,是不能出现结果的,我之前也测试过:当我选择不是第一页的时候 SELECT TOP 20 * FROM tb_news WHERE nid NOT IN(SELECT TOP 20 nid FROM tb_news)可以有结果返回的,那现在怎么办呢?

access与sql查询语句转换注意事项

答案就是:我作一个判断,当第一页的时候,不用公式来套,第二页以后才用公式来进行查询,结果也证明是对的。附上代码:

$url = ad_news.php? ;

$page = intval($page) ? intval($page): 1;

$rsofpage = 3;//设置每页显示的记录数

$sql = “SELECT count(*) as total FROM {$_pre}news”;

$rs = $db->GetRow( $sql );

$total_rs = $rs['total'];

$total_page = ceil($total_rs/$rsofpage);

$offset = ($page-1) * $rsofpage;

if($page==1) $sql = “SELECT TOP $rsofpage * FROM {$_pre}news ORDER BY nid DESC”;

else $sql = “SELECT TOP $rsofpage * FROM {$_pre}news WHERE nid NOT IN(SELECT TOP $offset nid FROM {$_pre}news ORDER BY nid DESC) ORDER BY nid DESC”;

$rs = $db->GetAll( $sql );

$arr = array();

for($i=0;$i<count($rs);$i++)

{

$rs[$i]['created'] = formatdate($rs[$i]['created'] , 4);

$rs[$i]['description'] = msubstr(htmlchars_decode($rs[$i]['description']) , 0 , 200); $arr[] = $rs[$i];

}

$pages = numofpage($total_rs,$page,$total_page,$url);

大家echo $pages就可看到结果啦!

附上一个分页函数(verycms的作者所有,哈哈):

function numofpage($count,$page,$numofpage,$url,$max=0){ $total=$numofpage;

$max && $numofpage > $max && $numofpage=$max;

if($numofpage <= 1 || !is_numeric($page)){

return ”;

}else{

$pages=”<div class=\”pages\”><a href=\”{$url}page=1\” style=\”font-weight:bold\”>«</a>”;

$flag=0;

for($i=$page-3;$i<=$page-1;$i++){

if($i<1) continue;

$pages.=”<a href=\”{$url}page=$i\”>$i</a>”;

}

$pages.=”<b> $page </b>”;

if($page<$numofpage){

access与sql查询语句转换注意事项

for($i=$page+1;$i<=$numofpage;$i++){

$pages.=”<a href=\”{$url}page=$i\”>$i</a>”;

$flag++;

if($flag==4) break;

}

}

$pages.=”<a href=\”{$url}page=$numofpage\” style=\”font-weight:bold\”>»</a> <input type=\”text\” size=\”3\” onkeydown=\”javascript:

if(event.keyCode==13){ location= {$url}page= +this.value;return false;}\”> Pages: ( $page/$total total ) Records: $count</div>”; return $pages;

}

}

access与sql查询语句转换注意事项

delete语句

access中删除时用:delete * from table1 where a>2 即只要把select 语句里的select 换成delete就可以了。

sqlserve 中则为: delete from table1 where a>2 即没有*号

as 后面的计算字段区别

access中可以这样:select a,sum(num) as kc_num,kc_num*num as all_kc_num 即可以把AS后的字段当作一个数据库字段参与计算。

sqlserver 中则为:select a,sum(num) as kc_num,sum(num)*num as all_kc_num 即不可以把AS后的字段当作一个数据库字段参与计算。

本文来源:https://www.bwwdw.com/article/r2hi.html

Top