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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?