• Oracle查询和问题简记


          现在做两个版本的系统,一个用的数据库是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的
          信息,更加安全。

  • 相关阅读:
    elastic-job-lite-console运维平台的部署使用
    elastic-job简单入门
    23种设计模式学习之单例模式
    23种设计模式学习之抽象工厂模式
    23种设计模式学习之静态工厂方法模式
    微信公众号开发之-回调的所有类型
    nginx学习-超详细nginx配置文件
    nginx学习-简介
    23种设计模式学习之一
    linux 下jenkins安装
  • 原文地址:https://www.cnblogs.com/pengdage110/p/4552042.html
Copyright © 2020-2023  润新知