意气风发、with as 公用表表明式

新近干活中境遇了多个主题素材,供给依据保存的流程数据,营造流程图。数据库中保存的流水生产线数据是树形布局的,表布局及数据如下图:

好像VIEW,不过不并不曾创设对象,WITH AS
公用表表明式不成立对象,只可以被后随的SELECT语句,其成效:

4503.com 1

  1. 落到实处递归查询(树形构造卡塔尔国

  2. 能够在二个口舌中多次援用公用表表明式,使其进一层简明

悉心观望表布局,会开掘其树形布局的性状:

二、非递归的集体表达式

  • FFI普拉多STNODE:标志是或不是为根节点
  • FSTABLENAME:标志来源单据名称
  • FSID:标志来源单据分录ID
  • FTTABLENAME :标志目的单据名称
  • FTID:标识目的单据分录ID

能够是定义列或自动列和select into 效果大致

图中的流程为:
发售左券–>出卖订单–>发货通告单–>出售出库单

--指定列with withTmp1 (code,cName)as( select id,Name from ClassUnis)select * from withTmp1--自动列with withTmp2 as( select * from ClassUnis where Author = 'system')select * from withTmp2

首先想到的章程正是把流程数据取回来,然后代码构造流程图。
首先个思路:依据根节点循环往下找,吭呲半天,开掘没那么简单。
因为别的多个根源单据都得以反复下推指标单据:
其次个思路:先找到终极节点,在从顶峰节点往上找只至根节点为0。
以此思路达成起来也从没那么复杂,逻辑理清,循环遍历,最后也能兑现结果。(但在大数据量情形下,易以致品质瓶颈。)

三、递归的不二秘诀

那贰遍大家换四个思路,让SQL来替大家做那风流浪漫繁杂的递归查询。

经过UNION ALL 连接部分。通过接二连三自己whit as
成立的表明式,它的连续几日条件就是递归的基准。可以从根节点往下找出,从子节点往父节点查找。只必要颠倒一下三回九转条件。比方代码中规格改为t.ID
= c.ParentId就可以

黄金时代、SqlServer 递归查询

with tree as( --0 as Level 定义树的层级,从0开始 select *,0 as Level from ClassUnis where ParentId is null union all --t.Level + 1每递归一次层级递增 select c.*,t.Level + 1 from ClassUnis c,tree t where c.ParentId = t.ID --from ClassUnis c inner join tree t on c.ParentId = t.ID)select * from tree where Author not like'%/%'

1、基本概念

公用表表明式 (CTE卡塔尔(قطر‎ 能够感觉是在单个 SELECT、INSERT、UPDATE、DELETE 或
CREATE VIEW
语句的实施范围钦点义的有的时候结果集。公用表表明式能够总结对小编的援用,这种表明式称为递归公用表表明式。

  • 创办递归查询。有关详细音信,请参阅应用公用表说明式的递归查询.aspx)。
  • 在没有要求健康使用视图时替换视图,也正是说,不必定会将定义存款和储蓄在元数据中。
  • 启用按从标量嵌套 select
    语句派生的列进行分组,大概按不明了函数或有外界访谈的函数实行分组。
  • 在一直以来语句中再三援引生成的表。

MSDN上对CTE的介绍
T-SQL查询进级–详整公用表表明式(CTE卡塔尔

CTE 的主干语法构造如下:

WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )
--只有在查询定义中为所有结果列都提供了不同的名称时,列名称列表才是可选的。
--运行 CTE 的语句为:
SELECT <column_list> FROM expression_name;

即四个部分:

  1. 公用表表明式的名字(在WITH关键字之后)
  2. 查询的列名(可选)
  3. 紧跟AS之后的SELECT语句(生龙活虎经AS之后有八个对公用表的查询,则独有首先个查询有效