SQL:如何从具有“多对多”相关列的表中获取所有后代

时间:2014-10-09 13:29:35

标签: sql sql-server many-to-many recursive-query

我仍在探索SQL,因此我有一个显而易见的问题。 我在SQL Server 2008 R2中有下表。 如您所见,这是一个映射表,其中InstrumentID和ProductID之间存在“多对多”关系:

|InstrumentID | ProductID   |ID(PK)|
|-------------|-------------|------|
|10           |21           |0     |
|10           |22           |1     |
|11           |22           |2     |
|11           |23           |3     |
|12           |24           |4     |
|12           |25           |5     |
|----------------------------------|

我希望编写一个查询/ SP作为输入,让我们说一个InstrumentID,并返回递归提取的所有相关映射。 例如,假设我提供了InstrumentID = 10.那么,令人满意的结果将是:

|InstrumentID | ProductID   |ID(PK)|
|-------------|-------------|------|
|10           |21           |0     |
|10           |22           |1     |
|11           |22           |2     |
|11           |23           |3     |
|----------------------------------|

实现这一目标的最佳方法是什么? 一个例子肯定是有用的。

我使用CTE尝试了以下查询:

WITH Map
AS ( 
    -- Anchor
    SELECT InstrumentID, ProductID
    FROM InstrumentProduct
    WHERE InstrumentID IN (10)
    UNION ALL

    -- Recursive
    SELECT IP.InstrumentID, IP.ProductID
    FROM InstrumentProduct IP
    INNER JOIN Map 
        ON IP.InstrumentID = Map.InstrumentID 
        OR IP.ProductID = Map.ProductID
)
SELECT *
FROM Map
OPTION (MAXRECURSION 50);

但执行查询时出现错误:“语句已终止。最大递归5在语句完成之前已用尽。” 然而,结果显然是正确的,但重复。

任何形式的帮助和建议肯定都有帮助。 谢谢!

0 个答案:

没有答案