LaB*_*cca 4 t-sql sql-server recursive-query
我需要编写一个多次调用递归查询的查询.
我无法弄清楚该怎么做.我想我可以通过使用游标,在运行时准备sql语句然后使用EXEC(mySQLstatement)在每个游标FETCH NEXT运行它来做到这一点.
无论如何,这不是好方法.
这是问题(当然这里是简化的,我只留下必要的列来表达自己):我有一个客户树(层次结构),并且每个客户都定义了一些联系人.
CUSTOMERS表包含ID_CUSTOMER字段和ID_PARENT_CUSTOMER字段,CUSTOMER_CONTACTS表包含ID_CUSTOMER字段和ID_CONTACT字段.
通过此查询(它可以工作),我可以获得客户308的所有联系人以及其子客户的所有联系人:
with [CTE] as (
select ID_CUSTOMER from CUSTOMERS c where c.ID_CUSTOMER = 308
union all
select c.ID_CUSTOMER from [CTE] p, CUSTOMERS c
where c.ID_PARENT_CUSTOMER = p.ID_CUSTOMER
)
select ID_CUSTOMER into #Customer308AndSubCustomers from [CTE]
select 308 as ParentCustomer, ID_CUSTOMER, ID_CONTACT, from CUSTOMER_CONTACTS
WHERE ID_CUSTOMER IN (select * from #Customer308AndSubCustomers)
drop table #Customer308AndSubCustomers
Run Code Online (Sandbox Code Playgroud)
但是我想在所有客户的单个查询中都有相同的信息,而不仅仅是308.所以这就是为什么我建议使用游标,这样我就可以重用上面的语句而只使用变量而不是308.
但你能建议更好的查询吗?
只需从锚点部分删除过滤条件:
WITH q AS
(
SELECT ID_CUSTOMER, ID_CUSTOMER AS root_customer
FROM CUSTOMERS c
UNION ALL
SELECT c.ID_CUSTOMER, q.root_customer
FROM q
JOIN CUSTOMERS c
ON c.ID_PARENT_CUSTOMER = q.ID_CUSTOMER
)
SELECT *
FROM q
Run Code Online (Sandbox Code Playgroud)
root_customer 将告诉你链的根源.
请注意,可能会多次返回相同的客户.
比如说,一个孙子将至少返回三次:在它的祖父母树,它的父树和它自己的树中,但每次都有不同的root_customer.
| 归档时间: |
|
| 查看次数: |
8035 次 |
| 最近记录: |