Sql server 如何将递归查询用作子查询?

Sql server 如何将递归查询用作子查询?,sql-server,tsql,recursive-query,Sql Server,Tsql,Recursive Query,我需要编写一个多次调用递归查询的查询 我不知道该怎么做。我想我可以通过使用游标,在运行时准备sql语句,然后在每次游标提取时使用EXEC(mySQLstatement)来运行它 无论如何,这不是一个好办法 这就是问题所在(当然这里简化了,我只留下必要的专栏来表达自己): 我有一个客户树(层次结构),每个客户都定义了一些联系人 CUSTOMERS表包含一个ID\u CUSTOMER字段和一个ID\u PARENT\u CUSTOMER字段 CUSTOMER\u CONTACTS表包含一个ID\u

我需要编写一个多次调用递归查询的查询

我不知道该怎么做。我想我可以通过使用游标,在运行时准备sql语句,然后在每次游标提取时使用EXEC(mySQLstatement)来运行它

无论如何,这不是一个好办法

这就是问题所在(当然这里简化了,我只留下必要的专栏来表达自己): 我有一个客户树(层次结构),每个客户都定义了一些联系人

CUSTOMERS表包含一个ID\u CUSTOMER字段和一个ID\u PARENT\u CUSTOMER字段 CUSTOMER\u CONTACTS表包含一个ID\u CUSTOMER字段和一个ID\u 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
但我希望在一个查询中,所有客户都能得到相同的结果,而不仅仅是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
root\u客户
将显示链的根

请注意,相同的客户可能会被退回多次


比如说,孙辈将至少返回三次:在它的祖辈树、父树和自己的树中,但每次使用不同的
根用户

在PostgreSQL中,您可以编写递归查询CTE,如下所示。 下面的查询获取id为(7)的给定类别的所有子类别


是的,是的,是的!这是我使用递归查询的第一天,我只是还不喜欢它们。非常感谢,这解决了我的问题!
WITH RECURSIVE category_tree(id, parent_category) AS (
   SELECT id, parent_category
   FROM category
   WHERE id = 7  -- this defines the start of the recursion
   UNION ALL
   SELECT child.id,  child.parent_category
   FROM category   child
     JOIN category_tree  parent ON parent.id = child.parent_category -- the self join to the CTE builds up the recursion
)
SELECT * FROM category_tree;