数据库
首页 > 数据库> > SQL With As 用法

SQL With As 用法

作者:互联网

项目中需要用到查询筛选出特定用户,数据类型如下

筛选出离职用户,特此记录用法如下。

WITH AS短语,也叫做子查询部分(subquery factoring),可以定义一个SQL片断,该SQL片断会被整个SQL语句用到。可以使SQL语句的可读性更高,也可以在UNION ALL的不同部分,作为提供数据的部分。

对于UNION ALL,使用WITH AS定义了一个UNION ALL语句,当该片断被调用2次以上,优化器会自动将该WITH AS短语所获取的数据放入一个Temp表中。而提示meterialize则是强制将WITH AS短语的数据放入一个全局临时表中。很多查询通过该方式都可以提高速度。

WITH temp AS
  (SELECT REPLACE(eaa1,';',',') AS text ,
    META_VALUE,
    META_NAME
  FROM DAT_SYSTEM_META
  WHERE meta_cata_id IN
    (SELECT cata_id FROM DAT_SYSTEM_META_CATA
    )
  AND eaa1 IS NOT NULL
  UNION ALL
  SELECT REPLACE(eaa2,';',',') AS text ,
    META_VALUE ,
    META_NAME
  FROM DAT_SYSTEM_META
  WHERE meta_cata_id IN
    (SELECT cata_id FROM DAT_SYSTEM_META_CATA
    )
  AND eaa2 IS NOT NULL
  UNION ALL
  SELECT REPLACE(eaa3,';',',') AS text ,
    META_VALUE ,
    META_NAME
  FROM DAT_SYSTEM_META
  WHERE meta_cata_id IN
    (SELECT cata_id FROM DAT_SYSTEM_META_CATA
    )
  AND eaa3 IS NOT NULL
  UNION ALL
  SELECT REPLACE(eaa4,';',',') AS text ,
    META_VALUE ,
    META_NAME
  FROM DAT_SYSTEM_META
  WHERE meta_cata_id IN
    (SELECT cata_id FROM DAT_SYSTEM_META_CATA
    )
  AND eaa4 IS NOT NULL
  UNION ALL
  SELECT REPLACE(eaa5,';',',') AS text ,
    META_VALUE ,
    META_NAME
  FROM DAT_SYSTEM_META
  WHERE meta_cata_id IN
    (SELECT cata_id FROM DAT_SYSTEM_META_CATA
    )
  AND eaa5 IS NOT NULL
  )

  
SELECT SUBSTR(text,instr(text,',',1,rn)   +1,instr(text,',',1,rn+1)-instr(text,',',1,rn)-1) text,
       SUBSTR( SUBSTR(text,instr(text,',',1,rn)+1,instr(text,',',1,rn+1)-instr(text,',',1,rn)-1),
         instr(SUBSTR(text,instr(text,',',1,rn)+1,instr(text,',',1,rn+1)-instr(text,',',1,rn)-1), '(') + 1, 
         instr(SUBSTR(text,instr(text,',',1,rn)+1,instr(text,',',1,rn+1)-instr(text,',',1,rn)-1), ')') - 
         instr(SUBSTR(text,instr(text,',',1,rn)+1,instr(text,',',1,rn+1)-instr(text,',',1,rn)-1), '(') - 1 
       ) AS test2,
       META_NAME,
       META_VALUE
FROM
  (SELECT ','
    ||t1.text
    ||',' text,
    META_NAME,
    META_VALUE,
    t2.rn
  FROM
    (SELECT text,LENGTH(text)-LENGTH(REPLACE(text,',',''))+1 rn ,META_VALUE,META_NAME  FROM temp
    ) t1,
    (SELECT rownum rn
    FROM all_objects
    WHERE rownum <=
      (SELECT MAX(LENGTH(text)-LENGTH(REPLACE(text,',',''))+1) rn  FROM temp
      )
    ) t2
  WHERE t1.rn >= t2.rn
  ORDER BY text,
    rn
  ) t,
  ORG_EMPLOYEE o
WHERE O.Emp_Num = SUBSTR( SUBSTR(text,instr(text,',',1,rn)+1,instr(text,',',1,rn+1)-instr(text,',',1,rn)-1), instr(SUBSTR(text,instr(text,',',1,rn)+1,instr(text,',',1,rn+1)-instr(text,',',1,rn)-1), '(') + 1, instr(SUBSTR(text,instr(text,',',1,rn)+1,instr(text,',',1,rn+1)-instr(text,',',1,rn)-1), ')') - instr(SUBSTR(text,instr(text,',',1,rn)+1,instr(text,',',1,rn+1)-instr(text,',',1,rn)-1), '(') - 1 )
AND O.State     = '离职';

其中eaa1~eaa5分别代表审批人1~审批人5,存在于DAT_SYSTEM_META元数据配置表。DAT_SYSTEM_META_CATA代表元数据表

ORG_EMPLOYEE代表员工表。

参考文章:

https://www.cnblogs.com/Niko12230/p/5945133.html

标签:instr,text,用法,DAT,META,SQL,rn,SELECT
来源: https://blog.csdn.net/jike11231/article/details/118057580