现在做两个版本的系统,一个用的数据库是Access,另一个就是Oracle了。每个数据库支持的的查询SQL语句都有所区别,这里主要针对Access和Oracle做 记录。
首先贴出遇到问题最多的一条语句(现在可以通过运行),同时查询三个表:PUB_LOG(主),PUB_LOGTYPE(副),PUB_USER(副),提示的错误有:字段不允许、列 名无效,缺失左括号。 Access:=>"select m.ID AS ID,t.FULLNAME as LOGTYPE,m.INFO as INFO,m.[TIME] AS LOGTIME, IIF(m.result=1,'成功','失败') AS RESULT, u.FULLNAME AS USERNAME,u.LOGINNAME AS LOGINNAME, m.DESCRIPTIONSTR AS DESCRIPTIONSTR,m.HOSTINFO AS HOSTINFO FROM (([select * from PUB_LOG]. as m LEFT JOIN PUB_LOGTYPE t on t.ID=m.TYPEKEY) LEFT JOIN PUB_USER u on u.ID=m.USERID) {0} order by m.ID DESC ", strWhere.Trim() == "" ? "" : string.Format(" where {0} ", strWhere));
Oracle:=>select m.ID AS ID,t.FULLNAME as LOGTYPE,m.INFO as INFO,m.TIME AS LOGTIME DECODE(m.result,1,'成功','失败') AS RESULT, u.FULLNAME AS USERNAME,u.LOGINNAME AS LOGINNAME, m.DESCRIPTIONSTR AS DESCRIPTIONSTR,m.HOSTINFO AS HOSTINFO, FROM ((PUB_LOG m LEFT JOIN PUB_LOGTYPE t on t.ID=m.TYPEKEY) LEFT JOIN PUB_USER u on u.ID=m.USERID) {0} order by m.ID DESC ", strWhere.Trim() == "" ? "" : string.Format(" where {0} ", strWhere));
一、当列名是关键字时,access需要将该列名用[]括起来,oracle中用“”(oracle查询时不需要),如上面语句中的TIME是关键字。
二、access赋值用@,oracle用:
Access:=> strSql.Append("select ID,TYPEKEY,INFO,RESULT,[TIME],USERID,DESCRIPTIONSTR,HOSTINFO from PUB_LOG ");
strSql.Append(" where ID=@ID"); OleDbParameter[] parameters = { new OleDbParameter("@ID", OleDbType.Integer, 4) }; parameters[0].Value = ID;(此处ID为有值变量)
Oracle:=> strSql.Append("select ID,TYPEKEY,INFO,RESULT,TIME,USERID,DESCRIPTIONSTR,HOSTINFO from PUB_LOG ");
strSql.Append(" where ID=:ID"); OracleParameter [] parameters = { new OracleParameter( ":ID", OracleType .Number , 4) }; parameters[0].Value = ID; ds = DbHelperOra .Query(strSql.ToString(), parameters);
三、Access支持IIF函数,但Oracle将此函数更改成了更灵活的DECODE函数,运用这两个函数可以对查询结果赋值、分类。表达式如下(可参照在上面语句中的运行):
IIF(表达式,'为真时的值','为假时得值')
DECODE(值,case1,'值1',case2,'值2'...,casen,'值n','所有其他情况')
eg1:表中性别列XB女生记为0,男生为1,但显示时需正常显示,用DECODE表示为 select decode(XB,0,'女','男')from 表 eg2:DECODE在排序中的应用,表table_subject,有subject_name列。要求按照:语、数、外的顺序进行排序 select * from table_subject order by decode(subject_name, '语文', 1, '数学', 2, '外语',3)
而在SQL Server 中对应的语句为 case 判断对象 when 判断条件 then 条件为真的场合返回的结果 eg:case Column1 when '1' then '男' when '2' then '女' else '其他'
四、inner join、left join、right join和full join (列如现有表A和B,A为主查询表,B为连接表)
inner join:内连接,查询结果为指定字段的值在A和B中同时存在的行结合成的新表 left join:左连接,查询结果为所有A中的项和与之匹配的B项的结合,若B中不存在匹配项则保留空格 right join:右连接 查询所有A表中与B匹配的项,返回结果为两表的结合 full join:全连接 查询A表和B表中的所有项全部例出,没有匹配项的保留空格,一对多时列出多列。
五、as 表示起别名(小新手啊),利用它可以解决名字过长的不便,可以方便的将数据在DataGridView中显示,运程使用DB中的Table时还可以隐藏DB的 信息,更加安全。
转载于:https://www.cnblogs.com/pengdage110/p/4552042.html