【问题标题】:Oracle SQL query result into a temporary table for use in a sub queryOracle SQL 查询结果存入临时表以供子查询使用
【发布时间】:2015-05-14 04:19:25
【问题描述】:

我想创建一个临时表,该表又从一个查询派生以用于另一个子查询,以简化 rownum() 和按条件分区。我输入的查询如下,但它返回一个错误 t.trlr_num 无效标识符。

with t as
(select distinct
          ym.trlr_num,
           ym.arrdte,
           ri.invnum,
           ri.supnum
from rcvinv ri, yms_ymr ym
where ym.trlr_cod='RCV'
and ri.trknum = ym.trlr_num
and ym.wh_id <=50
and ym.trlr_stat in ('C','CI','R','OR')
and ym.arrdte is not null
order by ym.arrdte desc
)
select trlr_number, invnum, supnum
from
(
  select 
    t.trlr_num, t.invnum, t.supnum,
    row_number() over (partition by t.trlr_number,t.invnum order by t.arrdte) as rn 
  from t
)
where rn = 1; 

从上面,我设置了一个条件来创建一个表 t 作为临时表,以便在下面的 select 语句中使用。但它似乎因标识符无效而出错。

【问题讨论】:

    标签: sql oracle temp-tables


    【解决方案1】:

    似乎是错字,用 trlr_num 替换 trlr_number 就可以了

    with t as
    (select distinct
              ym.trlr_num,
               ym.arrdte,
               ri.invnum,
               ri.supnum
    from rcvinv ri, yms_ymr ym
    where ym.trlr_cod='RCV'
    and ri.trknum = ym.trlr_num
    and ym.wh_id <=50
    and ym.trlr_stat in ('C','CI','R','OR')
    and ym.arrdte is not null
    order by ym.arrdte desc
    )
    select trlr_num, invnum, supnum
    from
    (
      select 
        t.trlr_num, t.invnum, t.supnum,
        row_number() over (partition by t.trlr_num,t.invnum order by t.arrdte) as rn 
      from t
    )
    where rn = 1; 
    

    【讨论】:

      【解决方案2】:

      您可以在 WITH 子句中使用多个子查询作为单独的临时表。这将是很好且易于理解的:

      WITH t AS
        (SELECT DISTINCT ym.trlr_num trlr_num,
          ym.arrdte arrdte,
          ri.invnum invnum,
          ri.supnum supnum
        FROM rcvinv ri,
          yms_ymr ym
        WHERE ym.trlr_cod ='RCV'
        AND ri.trknum     = ym.trlr_num
        AND ym.wh_id     <=50
        AND ym.trlr_stat IN ('C','CI','R','OR')
        AND ym.arrdte    IS NOT NULL
        ),
        t1 AS (
        SELECT t.trlr_num,
        t.arrdte,
        t.invnum,
        t.supnum,
        row_number() OVER (PARTITION BY t.trlr_num, t.invnum ORDER BY t.trlr_num, t.invnum DESC) rn
        FROM t
        )
      SELECT trlr_num, arrdte, invnum, supnum 
         FROM t1 
        WHERE rn = 1; 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-27
        • 2015-11-12
        • 2015-03-05
        • 1970-01-01
        • 1970-01-01
        • 2021-12-18
        • 2020-12-05
        • 1970-01-01
        相关资源
        最近更新 更多