首页 > 数据库 >SqlServer的With递归查询子父级

SqlServer的With递归查询子父级

时间:2023-10-31 14:23:43浏览次数:33  
标签:SourceCustomerId 递归 父级 SqlServer ConnectionCustomerId cc1 cc2 CustomerId SELECT

工作中有一个需求,要判断客户是否有后续订单,就是查后面的订单是否此客户ID下单, 而且要把此客户的所有关联的客户也都判断上

这有点头痛,因为关联客户是一个嵌套型父子级的结构,客户A关联客户B,客户B关联客户C,客户C关联客户D,无论取客户A、B、C、D任一一个去查,都要把整个关联关系的客户A、B、C、D全都查出来进行判断

并且要在select字段中使用,还要能批量使用,研究了关天发现可以用表值函数实现

ALTER FUNCTION [dbo].[GetCustomerConnectionRelations]
(    
    -- Add the parameters for the function here
    @CustomerId UNIQUEIDENTIFIER
)
-- Add the SELECT statement with parameter references here
    
RETURNS TABLE 
AS
RETURN 
(
    WITH cte AS (
        SELECT cc1.SourceCustomerId ,cc1.ConnectionCustomerId FROM co_crm.dbo.CustomerConnections AS cc1 WHERE cc1.SourceCustomerId=@CustomerId
        UNION ALL 
        SELECT cc2.SourceCustomerId,cc2.ConnectionCustomerId FROM co_crm.dbo.CustomerConnections AS cc2 INNER JOIN cte AS c ON cc2.ConnectionCustomerId= c.SourceCustomerId
    ),
    cte2 AS (
        SELECT cc1.SourceCustomerId ,cc1.ConnectionCustomerId FROM co_crm.dbo.CustomerConnections AS cc1 WHERE cc1.SourceCustomerId=@CustomerId
        UNION ALL 
        SELECT cc2.SourceCustomerId,cc2.ConnectionCustomerId FROM co_crm.dbo.CustomerConnections AS cc2 INNER JOIN cte2 AS c ON cc2.SourceCustomerId= c.ConnectionCustomerId
    )    
    SELECT @CustomerId AS CustomerId
    UNION 
    SELECT ConnectionCustomerId FROM cte
    UNION 
    SELECT ConnectionCustomerId FROM cte2
)

 

这样就可以在Sql里面的Select字段中使用了

SELECT CAST( ISNULL((SELECT TOP 1 1 FROM Orders o WHERE o.CustomerId IN (SELECT * FROM co_crm.dbo.GetCustomerConnectionRelations(t1.CustomerId))),0) AS BIT) AS '是否有后续订单' FROM  Table1 t1 

 

标签:SourceCustomerId,递归,父级,SqlServer,ConnectionCustomerId,cc1,cc2,CustomerId,SELECT
From: https://www.cnblogs.com/caijt/p/17800125.html

相关文章

  • sqlserver查询数据库状态SQL
    --连接数SELECTcount(0)asConnectCountfromsys.dm_exec_connections--死锁数量selectcntr_valuefromsys.dm_os_performance_counterswherecounter_name='NumberofDeadlocks/sec'andinstance_name='_Total'--缓存命中率selectcntr......
  • java怎么递归
    在Java中,递归(Recursion)是指一个方法在其内部调用自身的过程。递归通常用于解决可以被分解成相似子问题的问题。在编写递归函数时,需要定义递归的结束条件,以防止无限循环。下面是一个简单的递归示例,演示了如何使用递归计算一个数的阶乘:publicclassMain{publicstaticvoi......
  • [转]SqlServer大量更新引起同步链延时问题
    前言:   在SQLServer数据库中,当我们对一个位于同步链上的表进行更新时,如果更新的记录数也非常多,几百或是几千万,那么批量更新该表会造成同步链的大量延时(甚至有可能崩溃掉,即使同步链不崩溃,等的人也要崩溃了)。  原因:  一般情况下,Replication是根据我们更改的......
  • 如何基于通配符匹配在当前目录及其子目录中递归查找所有文件?
    内容来自DOChttps://q.houxu6.top/?s=如何基于通配符匹配在当前目录及其子目录中递归查找所有文件?如何基于通配符匹配在当前目录及其子目录中递归查找所有文件?使用find(Linux命令):find.-name"foo\*"find需要一个起始点,因此.(点)指向当前目录。......
  • 数据库数据恢复—误操作导致SqlServer数据库所在NTFS分区损坏的数据恢复案例
    SqlServer数据库数据恢复环境:一台服务器,windows操作系统+NTFS文件系统,运行了12个sqlserver数据库。SqlServer数据库故障:根据用户描述,故障情况是工作人员误操作导致服务器硬盘上sqlserver数据库所在分区损坏。经过北亚企安数据恢复工程师对故障服务器硬盘的初步检测,确认sqlserver......
  • SqlServer实现分页查询
    SqlServer实现分页查询1.利用max(主键)--分页查询公式-利用max(主键)selecttop@pageSize*from表名where主键>=(selectmax(主键)from(selecttop((@pageIndex-1)*@pageSize+1)主键from表名orderby主键asc)temp_max_ids)orderby主键;2.利用row_number关键字......
  • N皇后非递归解法
    #include<iostream>#include<cmath>usingnamespacestd;#defineN8intq[N+1];intcheck(inthang){ //该方法判断hang所在列是否合法 for(inti=1;i<hang;i++){ if(q[hang]==q[i]||abs(hang-i)==abs(q[hang]-q[i])){ return0; } } return1;}//N皇后的非递归解法voidqu......
  • 【基础算法】递归
    一、递归是什么递归是一种应用非常广泛的算法(或者变成技巧),很多算法的实现都需要依赖递归,比如,归并排序、快速排序、DFS深度优先搜索、二叉树的前中后序遍历等。所以,搞懂递归非常重要。简单来说,递归就是在函数中调用自己。递归求解问题分为“递”和“归”2个过程。 我们通过......
  • 递归函数
    斐波那契数列(1)#include<iostream>usingnamespacestd;intx(intn){if(n<=2){return1;}else{returnx(n-1)+x(n-2);}}intmain(){intn;cin>>n;inta=x(n);cout<<a;return0;}斐波那契......
  • 运用递归学习新知识——插入排序
    还是老样子,先讲一下插入排序的一个概念,比如校合唱团要按身高排队,从左到右由矮到高,小糖同学左边的同学已经按照身高站好了,右边还很乱,于是团长小蓝姐姐想了一个办法,她叫小糖同学往左看,小糖同学左边第一位叫男低1号,左边第二位叫男低2号,右边第一位叫男高1号,右边第二位叫男高2号,以此类......