SqlServer的With递归查询子父级

工作中有一个需求,要判断客户是否有后续订单,就是查后面的订单是否此客户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 

 

posted on   菜工  阅读(190)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示