oracle常用SQL语句

本文深入探讨了Oracle数据库中查询、数据转换及高级查询的技巧,包括重复数据行筛选、特定列数据转字符串、利用窗口函数进行排名及分区排序等操作。此外,介绍了如何在运行中创建表,以及查询每个月的第一天和最后一天的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.查询重复数据行:

 

select code

         from TableName

        group by code

        having count(code) > 1;

 

2.oracle 中查询某一列后,将多列数据转换为字符串

 

方法一:

 

 

--依次创建以下函数
CREATE OR REPLACE FUNCTION stragg(input varchar2) RETURN varchar2
  PARALLEL_ENABLE
  AGGREGATE USING string_agg_type;
--1
CREATE OR REPLACE TYPE "STRING_AGG_TYPE" as object
(
  total varchar2(4000),
  static function ODCIAggregateInitialize(sctx IN OUT string_agg_type)
    return number,
  member function ODCIAggregateIterate(self  IN OUT string_agg_type,
                                       value IN varchar2) return number,
  member function ODCIAggregateTerminate(self        IN string_agg_type,
                                         returnValue OUT varchar2,
                                         flags       IN number)
    return number,
  member function ODCIAggregateMerge(self IN OUT string_agg_type,
                                     ctx2 IN string_agg_type) return number
)
--2
create or replace type body string_agg_type is
  static function ODCIAggregateInitialize(sctx IN OUT string_agg_type)
    return number is
  begin
    sctx := string_agg_type(null);
    return ODCIConst.Success;
  end;
  member function ODCIAggregateIterate(self  IN OUT string_agg_type,
                                       value IN varchar2) return number is
  begin
    self.total := self.total || ',' || value;
    return ODCIConst.Success;
  end;
  member function ODCIAggregateTerminate(self        IN string_agg_type,
                                         returnValue OUT varchar2,
                                         flags       IN number) return number is
  begin
    returnValue := ltrim(self.total, ',');
    return ODCIConst.Success;
  end;
  member function ODCIAggregateMerge(self IN OUT string_agg_type,
                                     ctx2 IN string_agg_type) return number is
  begin
    self.total := self.total || ctx2.total;
    return ODCIConst.Success;
  end;
end;

---------------------------------------
--测试如下:
create table t_number
(id  number)

insert into t_number(id)
values(1);
commit;
insert into t_number(id)
values(2);
commit;
insert into t_number(id)
values(3);
commit;
insert into t_number(id)
values(4);
commit;
insert into t_number(id)
values(5);
commit;

--修改前:
select * from t_number;

   id
1  1
2  2
3  3
4  4
5  5

--修改后:
select stragg(distinct id) id from t_number;

   id
1  1,2,3,4,5

 

方法二:(此方法有字符串长度的限制)

 

注意:测试数据库表同上

 


 select max(sys_connect_by_path(id, ',')) as book_types

   from (select a.id, rownum ro

           from (select distinct u.id

                   from t_number u

                 

                 ) a) newtab

  start with newtab.ro = 1

 connect by prior newtab.ro = newtab.ro - 1;

 

 

 

 

 

3. 运行中创建表:create table rowconcat as select distinct BUSS_TYPE from t_tybook_before_bookspecial;

 

4.  Oracle高级查询之OVER (PARTITION BY ..)

 

引自【http://blog.youkuaiyun.com/ayou2008/article/details/7179001

rank()/dense_rank() over(partition by e.deptno order by e.sal desc)语法:

over:  在什么条件之上。

partition by e.deptno:  按部门编号划分(分区)。
order by e.sal desc:  按工资从高到低排序(使用rank()/dense_rank() 时,必须要带order by否则非法)
rank()/dense_rank():  分级
整个语句的意思就是:在按部门划分的基础上,按工资从高到低对雇员进行分级,“级别”由从小到大的数字表示(最小值一定为1)。 

那么rank()和dense_rank()有什么区别呢?
rank():  跳跃排序,如果有两个第一级时,接下来就是第三级。
dense_rank():  连续排序,如果有两个第一级时,接下来仍然是第二级。

 

5. Oracle函数Rank Over Partition使用实例详解(一)

 

引自【http://zhaisx.iteye.com/blog/774165

 

 

6. Oracle语法之OVER(PARTITION BY)及开窗函数【转载】

   引自【http://zou-qiang.iteye.com/blog/1306246

 

 

7.查询每个月的第一天和最后一天

          select last_day(add_months(sysdate,-1))+1 as firstday ,last_day(sysdate) as lastday from dual;

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值