Oracle查询和问题简记

时间:2021-10-23 13:12:25

现在做两个版本的系统,一个用的数据库是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的

      信息,更加安全。