oracle with 别名 as (select * from *)


with  别名 as (select * from *)
 
select * from 别名; 
相当于建个临时表,其实就是把一大堆重复用到的SQL语句放在with as 里面,取一个别名,后面的查询就可以用它 
这样对于大批量的SQL语句起到一个优化的作用,而且清楚明了。是个临时存储,一般是在存储过程里使用的,可以做多个表的连接,结果集的连接查询
  例子:
with t as (select * from emp where depno=10)
select * from t where empno=xxx

  几个表的例子:

  例子1:

with wd as (select did,arg(salary) 平均工资 from work), em as (select emp.*,w.salary from emp left join work w on emp.eid = w.eid) select * from wd,em where wd.did =em.did and wd.平均工资>em.salary;

  例子2:

with TT as   (select  to_char(ar.archtime,'MM') as month,--ar.archtime,
                     sum(decode(ar.indexname,'9bf85d01-7c16-43c8-893a-8d23de2aaac2', ar.num,null)) as pingtai,
                     sum(decode(ar.indexname,'90bebfc4-dea0-43c2-8967-6fe49bd573cb', ar.num,null)) as diaotao,
                     sum(decode(ar.indexname,'ab1859d0-f1ad-4a5d-af58-06ffda14e658', ar.num,null)) as tigong,
                      sum(decode(ar.indexname,'97863dc9-3480-447a-bdaf-cf73d34d1bfd', ar.num,null)) as tushu
                    from MC_ARCHIVESDATA ar 
                      where to_char(ar.archtime,'yyyy') = '{Year}'
                    group by ar.archtime),
               AA as (select lpad(level,2,0) as omonth from dual connect  by level<13)
  select AA.omonth,TT.pingtai,TT.diaotao,TT.tigong,TT.tushu from TT right join  AA on TT.month = AA.omonth order by AA.omonth

 oracle获取1年12个月:

--从具体的某月获取12个月(带年月)
SELECT TO_CHAR( add_months(to_date('2012', 'yyyy'), ROWNUM-1),  'YYYY-MM') as Monthly  
                                        FROM DUAL  
                                        CONNECT BY ROWNUM <= (select months_between(to_date('2013', 'yyyy'), to_date('2012', 'yyyy')) from dual)
--从1月起获取之后的12个月
select '2013-'||lpad(level,2,0) as Monthly from dual connect  by level<13                                          

 oralce对字段的基本操作:

--修改字段名:
alter table <table_name> rename column <column_old> to <column_new>;
--修改长度:
alter table <table_name> modify <column> <datatype>;

 --以下操作在 Oracle 10.2.0.1.0 中通过。
 
/*修改原字段名*/
 ALTER TABLE 表名 RENAME COLUMN 字段名 TO 字段名1;
 /*添加一个和原字段同名的字段*/
 ALTER TABLE 表名 ADD 字段名  VARCHAR2(30);
 /*
 将原来的数据更新到新字段中
 这是要注意,一定要显示进行数据类型转换(不同于MSSQL)
 */
 UPDATE 表名 SET 字段名 = CAST(字段名1 AS VARCHAR2(30));
 /*删除原来的备份字段*/
 ALTER TABLE 表名 DROP COLUMN 字段名1;

 oracle的递归查询:

表结构
T_XT_JIGOUXINXI:ID                 CHAR(32)             ID JIGOUMING    CHAR(20)             机构名称 FUJIGOU        CHAR(32)             所属机构
数据:

00000000000000000000000000000000

吐鲁番电业局       

 

74850da287104c849f9233b83a2e6bff

输电运维工区       

00000000000000000000000000000000

19a1b282c84e4d0b93e45de8e217cfc2

变电运维工区       

00000000000000000000000000000000

6ac135f8fc0a41fe896b16c3ec41330d

变电检修工区       

00000000000000000000000000000000

b12188adf66640e5ac212f51ae393db0

鄯善供电局         

00000000000000000000000000000000

909fb66a8b1d46faaf583bdfcbc8e346

托克逊供电局       

00000000000000000000000000000000

     根据父机构查询子机构:
           select t.id,rpad(' ',level*3-2,' ')||'├'||t.jigouming AS OrgName from t_xt_jigouxinxi t         start with trim(t.fujigou)IS Null /*父机构条件*/         connect by prior t.id=t.fujigou;
     根据子机构查询父机构:
           select t.id,rpad(' ',level*3-2,' ')||'├'||t.jigouming AS OrgName from t_xt_jigouxinxi t         start with trim(t.fujigou) IS NULL         connect by prior t.fujigou='19a1b282c84e4d0b93e45de8e217cfc2';  /*需要查询的子机构的父机构ID*/
顺便记一下Sql Server的查询写法: 表结构:
           CREATE TABLE [dbo].[Organization](     [ID] [int] IDENTITY(1,1) NOT NULL,     [OrgName] [nchar](30) NULL,     [PrivOrgID] [int] NULL,            CONSTRAINT [PK_Organization] PRIMARY KEY CLUSTERED (     [ID] ASC )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] ) ON [PRIMARY]

           select (case   id   when   null   then   ''   else   space(id)   end   )   +OrgName   as   OrgName   from   Organization


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM