oracle学习之with as

java端 mybatis

with as其实就是一个子查询

为什么要用WITH?

1. 如果需要在一段复杂查询里多次应用同一个查询,用WITH可实现代码重用;

2. WITH查询类似将查询结果保留到用户临时表里,在大的复杂查询中可以减少IO,有一定的性能优化作用。


WITH查询有何限制与特性?
4. 如果当前schema下有与WITH查询别名相同的表,查询中WITH查询生成的表优先;

5. 只能用于select 语句;

6. WITH可包含一个或多个查询;

7. WITH查询可被其它查询或WITH查询引用。

视图

 <select id="getBill" resultMap="BaseResultMap" parameterType="java.util.Map">
        WITH
        --基础数据,不分批次进行压缩
        T_CARRY_OVER AS(
            SELECT DISTINCT
            A.ID AS ID
            , A.MONTH AS MONTH
            , C.CHARGE_ITEM_ID AS CHARGE_ITEM_ID
            , B.ITEM_ID AS ITEM_ID
            FROM YKGL.WH_CARRY_OVER A
            , YKGL.WH_STOCK_CARRY_OVER B
            , YKGL.WH_ITEM C
            WHERE A.MONTH >= #{startTime}
            AND A.MONTH &lt; #{endTime}
            AND B.CARRY_OVER_ID = A.ID
            AND B.ITEM_ID = C.ID
        ),
        --进货
        T_IN AS(
            SELECT
            C.ITEM_ID AS ITEM_ID
            , SUM(C.QUANTITY) AS IN_QUANTITY
            , SUM(C.PURCHASE_AMOUNT) AS IN_PURCHASE_AMOUNT
            , SUM(C.RETAIL_AMOUNT) AS IN_RETAIL_AMOUNT
            FROM YKGL.WH_IN B
            , YKGL.WH_IN_DETAIL C
            WHERE B.CARRY_OVER_ID IN ( SELECT ID FROM T_CARRY_OVER )
            AND B.STATUS = 1
            AND C.IN_ID = B.ID
            GROUP BY C.ITEM_ID
        ),
        --出库
        T_OUT AS (
            SELECT
            C.ITEM_ID AS ITEM_ID
            , SUM(C.QUANTITY) AS OUT_QUANTITY
            , SUM(C.PURCHASE_AMOUNT) AS OUT_PURCHASE_AMOUNT
            , SUM(C.RETAIL_AMOUNT) AS OUT_RETAIL_AMOUNT
            FROM YKGL.WH_OUT B
            , YKGL.WH_OUT_DETAIL C
            WHERE B.CARRY_OVER_ID IN ( SELECT ID FROM T_CARRY_OVER )
            AND B.STATUS = 1
            AND C.OUT_ID = B.ID
            GROUP BY C.ITEM_ID
        ),
        --盘点
        T_CHECK AS (
            SELECT
            C.ITEM_ID
            , SUM(C.DIFF_QTY) AS NOW_DIFF_QTY
            , SUM(C.DIFF_PUR_AMT) AS DIFF_PUR_AMT
            , SUM(C.DIFF_RET_AMT) AS DIFF_RET_AMT
            FROM YKGL.WH_STOCK_CHECK B
            , YKGL.WH_STOCK_CHECK_DETAIL C
            WHERE B.CARRY_OVER_ID IN ( SELECT ID FROM T_CARRY_OVER )
            AND C.CHECK_ID = B.ID
            GROUP BY C.ITEM_ID
        ),
        --上期结余
        T_LAST AS (
            SELECT DISTINCT
            B.ITEM_ID AS ITEM_ID
            , SUM(B.QUANTITY) AS LAST_QUANTITY
            , SUM(B.PURCHASE_AMOUNT) AS LAST_PURCHASE_AMOUNT
            , SUM(RETAIL_AMOUNT) AS LAST_RETAIL_AMOUNT
            FROM YKGL.WH_CARRY_OVER A
            , YKGL.WH_STOCK_CARRY_OVER B
            WHERE A.MONTH = #{lastTime}
            AND B.CARRY_OVER_ID = A.ID
            GROUP BY B.ITEM_ID
        )
        SELECT
        T_CARRY_OVER.ITEM_ID
        , T_CARRY_OVER.MONTH
        , T_ITEM.NAME AS CHARGE_ITEM_NAME
        , T_ITEM.CODE AS CHARGE_ITEM_CODE
        , T_ITEM.UNIT
        , T_ITEM.SPEC
        , T_IN.IN_QUANTITY
        , T_IN.IN_PURCHASE_AMOUNT
        , T_IN.IN_RETAIL_AMOUNT
        , T_OUT.OUT_QUANTITY
        , T_OUT.OUT_PURCHASE_AMOUNT
        , T_OUT.OUT_RETAIL_AMOUNT
        , T_CHECK.NOW_DIFF_QTY
        , T_CHECK.DIFF_PUR_AMT
        , T_CHECK.DIFF_RET_AMT
        , T_LAST.LAST_QUANTITY
        , T_LAST.LAST_PURCHASE_AMOUNT
        , T_LAST.LAST_RETAIL_AMOUNT
        FROM T_CARRY_OVER
        LEFT OUTER JOIN HISBASE.CHARGE_ITEM T_ITEM ON T_ITEM.ID = T_CARRY_OVER.CHARGE_ITEM_ID AND T_ITEM.IS_HISTORY = 0
        LEFT OUTER JOIN T_IN ON T_IN.ITEM_ID = T_CARRY_OVER.ITEM_ID
        LEFT OUTER JOIN T_OUT ON T_OUT.ITEM_ID = T_CARRY_OVER.ITEM_ID
        LEFT OUTER JOIN T_CHECK ON T_CHECK.ITEM_ID = T_CARRY_OVER.ITEM_ID
        LEFT OUTER JOIN T_LAST ON T_LAST.ITEM_ID = T_CARRY_OVER.ITEM_ID

    </select>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值