WITH AS连用,也叫做子查询部分

WITH 通常与AS连用,也叫做子查询部分。
用法:
1). 可用来定义一个SQL片断,该片断会被整个SQL语句所用到。
           
2). 为了让SQL语句的可读性更高

3). 也有可能是在UNION ALL的不同部分,作为提供数据的部分。特别对于UNION ALL比较有
用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本
太高,所以可以使用WITH AS短语,则只要执行一遍即可。


例如:下面两种表达的是同一种意思:

          ①with alias as (select * from pra)

          ②select * from pra;

 with..as不能嵌套,但可以使用如下代码完成:
      ;with as(select from table_a),
    b as (select from where id in(3,4,5))
    select  from b
 

使用实例:从商户交易明细表中挑选出当天同一商户同一卡号发生的多笔交易

with t as (select mt_merchant_id,MT_TRXN_DATE,MT_TRXN_CARD_NO,count(mt_payable_amt) as  cnt  from cp_mertrx  
group by mt_merchant_id,MT_TRXN_DATE,MT_TRXN_CARD_NO order by mt_merchant_id,MT_TRXN_DATE,MT_TRXN_CARD_NO ) 
,b as ( select mt_merchant_id,MT_TRXN_DATE ,MT_TRXN_CARD_NO from t where t.cnt >1 order by MT_TRXN_DATE )
, c as (select   b.MT_TRXN_DATE ,b.mt_merchant_id,b.MT_TRXN_CARD_NO,MT_TRXN_TIME_HHMMSS,MT_TRXN_AMT
 from cp_mertrx  right join b on cp_mertrx.mt_merchant_id=b.mt_merchant_id and cp_mertrx.MT_TRXN_DATE=b.MT_TRXN_DATE and cp_mertrx.MT_TRXN_CARD_NO=b.MT_TRXN_CARD_NO ) 
select *  from c  order by  MT_TRXN_DATE ,mt_merchant_id,MT_TRXN_CARD_NO,MT_TRXN_TIME_HHMMSS
 
t 汇总同一天同一商户同一卡号的交易笔数
b 挑选出t中的多笔交易
c 根据b和商户明细表 组合挑选出需要的字段 (注意 使用join时字段名需要说明是哪张表,由于后期还需要使用b表,所以相关字段必须从b表中获取)
d 直接选取c中的数据


WITH AS连用,也叫做子查询部分