视图sql如下,业务如此,不得已而建之,因为报表:
CREATE OR REPLACE VIEW 日度处理_集气站产量 AS
SELECT DISTINCT
(
    SELECT distinct 日期 from 数据采集_采气井
    where 日期=CQJ.日期
) as 日期,
CQJ.单位代码 单位代码,
SUNIT.UNIT_RELATION 队名,
CQJ.单位名称 站别,
(
    SELECT SUM(日产气) FROM 数据采集_采气井
    WHERE 日期 = CQJ.日期
    AND 单位名称 = CQJ.单位名称
)
AS 日产气量,
(
    SELECT SUM(日产水) FROM 数据采集_采气井
    WHERE 日期 = CQJ.日期
    AND 单位名称 = CQJ.单位名称
)
AS 日产水量,
(
    SELECT SUM(日产油) FROM 数据采集_采气井
    WHERE 日期 = CQJ.日期
    AND 单位名称 = CQJ.单位名称
)
AS 凝析油日产量,
(
   select 日外输气量 from 数据采集_集气站
   where 日期=CQJ.日期
   and 单位名称=CQJ.单位名称
)
AS 日外输气量,
(
   select 日自用气量 from 数据采集_集气站
   where 日期=CQJ.日期
   and 单位名称=CQJ.单位名称
)
AS 日自用气量,
(
   select 日损耗气量 from 数据采集_集气站
   where 日期=CQJ.日期
   and 单位名称=CQJ.单位名称
)
AS 日损耗气量,
(
   select 凝析油销售量 from 数据采集_集气站
   where 日期=CQJ.日期
   and 单位名称=CQJ.单位名称
)
AS 日凝析油销售量,
(
   select 甲醇库存量 from 数据采集_集气站
   where 日期=CQJ.日期
   and 单位名称=CQJ.单位名称
)
AS 日甲醇库存量,
(
    SELECT SUM(站内注醇量+管线注醇量+套注注醇量) FROM 数据采集_采气井
    WHERE 日期 = CQJ.日期
    AND 单位名称 = CQJ.单位名称
)
AS 日耗甲醇量,
(
     SELECT SUM(日产气)
     FROM 数据采集_采气井 CTable
     WHERE  CTable.单位名称 = CQJ.单位名称
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,7)=SUBSTR(CQJ.日期,1,7)
)
AS 月累产气量,
(
     SELECT SUM(日产水)
     FROM 数据采集_采气井 CTable
     WHERE  CTable.单位名称 = CQJ.单位名称
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,7)=SUBSTR(CQJ.日期,1,7)
)
AS 月累产水量,
(
     SELECT SUM(日产油)
     FROM 数据采集_采气井 CTable
     WHERE  CTable.单位名称 = CQJ.单位名称
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,7)=SUBSTR(CQJ.日期,1,7)
)
AS 凝析油月累产量,
(
     SELECT SUM(日外输气量)
     FROM 数据采集_集气站 CTable
     WHERE  CTable.单位代码 = CQJ.单位代码
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,7)=SUBSTR(CQJ.日期,1,7)
)
AS 月累外输气量,
(
     SELECT SUM(日自用气量)
     FROM 数据采集_集气站 CTable
     WHERE  CTable.单位代码 = CQJ.单位代码
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,7)=SUBSTR(CQJ.日期,1,7)
)
AS 月累自用气量,
(
     SELECT SUM(日损耗气量)
     FROM 数据采集_集气站 CTable
     WHERE  CTable.单位代码 = CQJ.单位代码
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,7)=SUBSTR(CQJ.日期,1,7)
)
AS 月累损耗气量,
(
     SELECT SUM(凝析油销售量)
     FROM 数据采集_集气站 CTable
     WHERE  CTable.单位代码 = CQJ.单位代码
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,7)=SUBSTR(CQJ.日期,1,7)
)
AS 月凝析油销售量,
(
     SELECT SUM(甲醇库存量)
     FROM 数据采集_集气站 CTable
     WHERE  CTable.单位代码 = CQJ.单位代码
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,7)=SUBSTR(CQJ.日期,1,7)
)
AS 月甲醇库存量,
(
     SELECT SUM(站内注醇量+管线注醇量+套注注醇量)
     FROM 数据采集_采气井 CTable
     WHERE  CTable.单位名称 = CQJ.单位名称
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,7)=SUBSTR(CQJ.日期,1,7)
)
AS 月耗甲醇量,
(
     SELECT SUM(日产气)
     FROM 数据采集_采气井 CTable
     WHERE  CTable.单位名称 = CQJ.单位名称
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,4)=SUBSTR(CQJ.日期,1,4)
)
AS 年累产气量,
(
     SELECT SUM(日产水)
     FROM 数据采集_采气井 CTable
     WHERE  CTable.单位名称 = CQJ.单位名称
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,4)=SUBSTR(CQJ.日期,1,4)
)
AS 年累产水量,
(
     SELECT SUM(日产油)
     FROM 数据采集_采气井 CTable
     WHERE  CTable.单位名称 = CQJ.单位名称
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,4)=SUBSTR(CQJ.日期,1,4)
)
AS 凝析油年累产量,
(
     SELECT SUM(日外输气量)
     FROM 数据采集_集气站 CTable
     WHERE  CTable.单位代码 = CQJ.单位代码
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,4)=SUBSTR(CQJ.日期,1,4)
)
AS 年累外输气量,
(
     SELECT SUM(日自用气量)
     FROM 数据采集_集气站 CTable
     WHERE  CTable.单位代码 = CQJ.单位代码
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,4)=SUBSTR(CQJ.日期,1,4)
)
AS 年累自用气量,
(
     SELECT SUM(日损耗气量)
     FROM 数据采集_集气站 CTable
     WHERE  CTable.单位代码 = CQJ.单位代码
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,4)=SUBSTR(CQJ.日期,1,4)
)
AS 年累损耗气量,
(
     SELECT SUM(凝析油销售量)
     FROM 数据采集_集气站 CTable
     WHERE  CTable.单位代码 = CQJ.单位代码
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,4)=SUBSTR(CQJ.日期,1,4)
)
AS 年凝析油销售量,
(
     SELECT SUM(甲醇库存量)
     FROM 数据采集_集气站 CTable
     WHERE  CTable.单位代码 = CQJ.单位代码
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,4)=SUBSTR(CQJ.日期,1,4)
)
AS 年甲醇库存量,
(
     SELECT SUM(站内注醇量+管线注醇量+套注注醇量)
     FROM 数据采集_采气井 CTable
     WHERE  CTable.单位名称 = CQJ.单位名称
     AND CTable.日期<=CQJ.日期
     AND SUBSTR(CTable.日期,1,4)=SUBSTR(CQJ.日期,1,4)
)
AS 年耗甲醇量,
(
     SELECT SUM(日产气)
     FROM 数据采集_采气井 CTable
     WHERE  CTable.单位名称 = CQJ.单位名称
     AND CTable.日期<=CQJ.日期
)
AS 历史累计产气量,
(
     SELECT SUM(日产水)
     FROM 数据采集_采气井 CTable
     WHERE  CTable.单位名称 = CQJ.单位名称
     AND CTable.日期<=CQJ.日期
)
AS 历史累计产水量,
(
     SELECT SUM(日产油)
     FROM 数据采集_采气井 CTable
     WHERE  CTable.单位名称 = CQJ.单位名称
     AND CTable.日期<=CQJ.日期
)
AS 凝析油历史累计产量,
(
     SELECT SUM(日外输气量)
     FROM 数据采集_集气站 CTable
     WHERE  CTable.单位代码 = CQJ.单位代码
     AND CTable.日期<=CQJ.日期
)
AS 历史累计外输气量,
(
     SELECT SUM(日自用气量)
     FROM 数据采集_集气站 CTable
     WHERE  CTable.单位代码 = CQJ.单位代码
     AND CTable.日期<=CQJ.日期
)
AS 历史累计自用气量,
(
     SELECT SUM(日损耗气量)
     FROM 数据采集_集气站 CTable
     WHERE  CTable.单位代码 = CQJ.单位代码
     AND CTable.日期<=CQJ.日期
)
AS 历史累计损耗气量,
(
     SELECT SUM(凝析油销售量)
     FROM 数据采集_集气站 CTable
     WHERE  CTable.单位代码 = CQJ.单位代码
     AND CTable.日期<=CQJ.日期
)
AS 历史累计凝析油销售量,
(
     SELECT SUM(甲醇库存量)
     FROM 数据采集_集气站 CTable
     WHERE  CTable.单位代码 = CQJ.单位代码
     AND CTable.日期<=CQJ.日期
)
AS 历史累计甲醇库存量,
(
     SELECT SUM(站内注醇量+管线注醇量+套注注醇量)
     FROM 数据采集_采气井 CTable
     WHERE  CTable.单位名称 = CQJ.单位名称
     AND CTable.日期<=CQJ.日期
)
AS 历史累计耗甲醇量
FROM 数据采集_采气井 CQJ,数据采集_集气站 JQZ,SYS_UNIT SUNIT
WHERE CQJ.单位代码 = SUNIT.UNIT_ID

解决方案 »

  1.   

    有是个高手,
    你这样写能快就怪了,
    你把大量查询放在Select字段,每个SQL都要走无数个SQL。
    我刚才简单数了一下,你获取一行记录要走36个SQL,这样肯定快不了。建议更换写法,把所有表放在From然后使用Where进行关联,也许能快点,
    这样写效率超差。对于重复的统计表可以使用With子句。
    不明白,再联络。
      

  2.   

    朋友所言极是
    查询主要慢在了第一行的DISTINCT 上
      

  3.   

    先将数据过滤到temp table, 再sum应要快些.
      

  4.   

    哪位高人指点一下怎么把它写进存储过程例如:
    CREATE OR REPLACE VIEW 日度处理_集气站产量 AS 
    SELECT

        SELECT SUM(日产气) FROM 数据采集_采气井 
        WHERE 日期 = CQJ.日期 
        AND 单位名称 = CQJ.单位名称 

    AS 日产气量 
    FROM 数据采集_采气井 CQJ,数据采集_集气站 JQZ,SYS_UNIT SUNIT 
    WHERE CQJ.单位代码 = SUNIT.UNIT_ID 
      

  5.   

    declare
      s varchar2(1000);
    begin
      s:='CREATE OR REPLACE VIEW 日度处理_集气站产量 AS  
      s:=s||'SELECT '
      ........
      execute immediate s;
    end;ddl语句可以用动态SQL另外,做这种报表建议在客户端处理,逐步取得各个值,也好对性能瓶颈进行定位.
      

  6.   

    谢谢楼上哪位高人指点一下怎么把它写进存储过程 例如: 
    CREATE OR REPLACE VIEW 日度处理_集气站产量 AS  
    SELECT 
    (  
        SELECT SUM(日产气) FROM 数据采集_采气井  
        WHERE 日期 = CQJ.日期  
        AND 单位名称 = CQJ.单位名称  
    )  
    AS 日产气量  
    FROM 数据采集_采气井 CQJ,数据采集_集气站 JQZ,SYS_UNIT SUNIT  
    WHERE CQJ.单位代码 = SUNIT.UNIT_ID 
      

  7.   

    谢谢大家
    两天了,希望高人给优化一下
    本人简化一下,优化下面sql
    SELECT DISTINCT 

        SELECT distinct 日期 from 数据采集_采气井 
        where 日期=CQJ.日期 
    ) as 日期, 
    CQJ.单位代码 单位代码, 
    SUNIT.UNIT_RELATION 队名, 
    CQJ.单位名称 站别, 

         SELECT SUM(日产气) 
         FROM 数据采集_采气井 CTable 
         WHERE  CTable.单位名称 = CQJ.单位名称 
         AND CTable.日期 <=CQJ.日期 
         AND SUBSTR(CTable.日期,1,7)=SUBSTR(CQJ.日期,1,7) 

    AS 月累产气量, 

         SELECT SUM(日产水) 
         FROM 数据采集_采气井 CTable 
         WHERE  CTable.单位名称 = CQJ.单位名称 
         AND CTable.日期 <=CQJ.日期 
         AND SUBSTR(CTable.日期,1,7)=SUBSTR(CQJ.日期,1,7) 

    AS 月累产水量FROM 数据采集_采气井 CQJ,数据采集_集气站 JQZ,SYS_UNIT SUNIT 
    WHERE CQJ.单位代码 = SUNIT.UNIT_ID 
      

  8.   

    裁剪过的SQL好看多了,
    想优化SQL必须指导几个问题:【数据采集_采气井 CQJ】和【数据采集_集气站 JQZ】
    必须使用笛卡尔乘积吗?好奇怪【数据采集_采气井.日期】是什么形式?
    2008-03-01?这句SQL的目的是什么【 SUBSTR(CTable.日期,1,7)=SUBSTR(CQJ.日期,1,7) 】?你的SQL存在结构的问题,所以需要调整结构才可以,
    我需要知道你SQL的目的,回答后给你结果。
      

  9.   

    呵呵,好专业【数据采集_采气井 CQJ】和【数据采集_集气站 JQZ】 
    必须使用笛卡尔乘积吗?非必须【数据采集_采气井.日期】是什么形式? 
    2008-03-01? 对这句SQL的目的是什么【 SUBSTR(CTable.日期,1,7)=SUBSTR(CQJ.日期,1,7) 】? 
    目的是取到月份最终实现:
    序号    日期           站别         月累产气量   月累产水量
    1 2008-02-01 集气10号站 213907 15.36
    2 2008-02-02 集气10号站 433706 30.67
    3 2008-02-03 集气10号站 650868 42.82
    4 2008-02-04 集气10号站 868005 54.96
    5 2008-02-05 集气10号站 1083374 71.52
    6 2008-02-06 集气10号站 1296878 88.25
    7 2008-02-07 集气10号站 1511161 101.69
    8 2008-02-08 集气10号站 1724332 117.5
    9 2008-02-09 集气10号站 1941708 131.39
    10 2008-02-10 集气10号站 2158742 146.83
      

  10.   

    不知这位是GG还是JJ呀
    说的话很温暖 :)
      

  11.   

    刚才一直在开会,
    开会的时候还想这个问题,
    我原来也做过这样的程序,计算某种数据的变化率,
    要解决这个问题应该从设计层面去解决,你在统计【月累产气量】变化的时候应该把合计放在前端去处理,
    也就是Java或是docNet侧,SQL处理起来相当费时,我早期也是用SQL
    去处理的,后期也是为了速度该成了前端处理,或者是在PL/SQL内处理,
    建议变化一下思想,我也在版本管理器中,去给你找找我原来写的那个,
    基本的我记得,使用With子句先统计出【日别】信息,然后使用分析函数
    【lag】模拟创建树形结构,然后在使用【conntion by】进行连接,再统计,
    绕了一大圈。
      

  12.   

    给你个连接,这里有处理方法的一部分,我原来也是参考这个,
    希望给你帮助。
    http://www.orafaq.com/forum/t/70111/0/
      

  13.   

    这个比较有代表性:SELECT DISTINCT
    (
        SELECT distinct 日期 from 数据采集_采气井
        where 日期=CQJ.日期
    ) as 日期,
    CQJ.单位代码 单位代码,
    SUNIT.UNIT_RELATION 队名,
    CQJ.单位名称 站别,
    (
         SELECT SUM(日产气)
         FROM 数据采集_采气井 CTable
         WHERE  CTable.单位名称 = CQJ.单位名称
         AND CTable.日期<=CQJ.日期
         AND SUBSTR(CTable.日期,1,7)=SUBSTR(CQJ.日期,1,7)
    )
    AS 月累产气量,
    (
         SELECT SUM(日外输气量)
         FROM 数据采集_集气站 CTable
         WHERE  CTable.单位代码 = CQJ.单位代码
         AND CTable.日期<=CQJ.日期
         AND SUBSTR(CTable.日期,1,7)=SUBSTR(CQJ.日期,1,7)
    )
    AS 月累外输气量 
    FROM 数据采集_采气井 CQJ,数据采集_集气站 JQZ,SYS_UNIT SUNIT
    WHERE CQJ.单位代码 = SUNIT.UNIT_ID