1

我正在清理以前工程师(不是程序员)的 SQL 代码。

一个查询 UNION 将结果合并为 2 个几乎相同的查询,带有一个完全相同的子查询,并且原始代码有很多“where”子句(在两个查询中)来过滤数据。

我正在尝试使用“with”表首先过滤数据,然后进行子查询和联合。

在“准备”步骤期间,我不断收到通用的“通信通道上的文件结尾”错误,但是当我从子查询中删除 DISTINCT 子句时,它可以工作 - 但它没有给我我需要的结果.

这是我“减少”以显示错误的代码:

with

FilteredData as
(
    select
        ST.part
    ,   ST.order_No
    ,   ST.induct_Date
    ,   ST.complete_Date
    from
        Some_Table   ST
    where
    (
            ST.part     is not null
        and ST.order_No is not null
    )
    -- MUCH more filtering goes on here, to limit the number of records to look at
)
,
TempTable_01A as
(
    select
        FD.part
    ,   count( DISTINCT FD.part ) Count_1   -- The DISTINCT needs to be removed for it to compile
    ,   0                         Count_2
    ,   0                         AvgLengthOpen
    from
        FilteredData   FD
    where
            FD.induct_Date is not null
        and ( FD.induct_Date   >=  to_date( '01-01-2013', 'MM-DD-YYYY' )       )
        and ( FD.induct_Date   < ( to_date( '01-31-2013', 'MM-DD-YYYY' ) + 1 ) )
    group by
        FD.part
)
,
TempTable_01B as
(
    select
        FD.part
    ,   0                                        Count_1
    ,   count( DISTINCT FD.part )                Count_2   -- The DISTINCT needs to be removed for it to compile
    ,   avg( FD.complete_Date - FD.induct_Date ) AvgLengthOpen
    from
        FilteredData   FD
    where
            FD.complete_Date is not null
        and ( FD.complete_Date   >=  to_date( '01-01-2013', 'MM-DD-YYYY' )       )
        and ( FD.complete_Date   < ( to_date( '01-31-2013', 'MM-DD-YYYY' ) + 1 ) )
    group by
        FD.part
)
,
UnionTable as
(
    select
        TT_A.part
    ,   TT_A.Count_1
    ,   TT_A.Count_2
    ,   TT_A.AvgLengthOpen
    from
        TempTable_01A   TT_A

union

    select
        TT_B.part
    ,   TT_B.Count_1
    ,   TT_B.Count_2
    ,   TT_B.AvgLengthOpen
    from
        TempTable_01B   TT_B
)

select
    UT.part
,   max( UT.Count_1       ) MaxCount_1
,   max( UT.Count_2       ) MaxCount_2
,   max( UT.AvgLengthOpen ) MaxAvgLengthOpen
from
    UnionTable   UT
group by
    UT.part
order by
    1

注意:我使用的是 Oracle SQL,版本 10.0.2.1697。无论我使用的是 PLSQL Developer 还是我的 Perl 程序,我都会遇到同样的错误。

4

0 回答 0