没有函数或游标的递归SQL JOIN?

时间:2012-03-22 01:19:01

标签: sql sql-server-2005 select recursive-query

我有一张表,里面有一份刑事指控清单。这些指控可以代替......例如,如果一个小伙子被指控犯有攻击罪,但在审判期间,受害人死亡,所以指控可以取代谋杀。< / p>

我们有一个Substitution表,它包含From_Offence和To_Offence。当费用被替换时,我们创建一个新的费用,然后在替换表中记录From ID,然后记录新的To_Id。

CREATE TABLE [dbo].[ijis_court_item_association](
    [ijis_court_item_association_id] [int] IDENTITY(1,1) NOT NULL,
    [from_ijis_court_item_id] [int] NOT NULL,
    [to_ijis_court_item_id] [int] NOT NULL
)

充电可以多次替代。因此,充电1成为充电2,但后来充电3.然后可能充电3成为充电4。

你会:

FROMID  TOID
1        2
2        3
3        4

要求是根据当前的费用ID返回费用ID列表。

所以,在英语中,开发人员会通过我的ChargeID:4,我需要返回该费用的历史记录(包括它的自我)。我的结果集将是:

4
3
2
1

我可以做一个函数,GetPreviousChargeId,然后以某种方式递归做某事?但是,我希望可能有一种聪明的方法来实现这一目标。

希望有办法。

1 个答案:

答案 0 :(得分:2)

我相信这应该有效。如上所述,这是Recursive CTE

WITH Charges AS
(
    --This should not be just a SELECT 4 because if no matches are found
    --then it will return a null and not recurse at all
    --This query will only run once at the beginning 
    --(it is the anchor to the recursion)
    SELECT to_ijis_court_item_id AS CourtID
    FROM ijis_court_item_association
    WHERE to_ijis_court_item_id = 4

    UNION ALL

    --This is the actual recursion, continuing to query until no results are found
    --It uses the first queries data to begin
    SELECT from_ijis_court_item_id AS CourtID
    FROM ijis_court_item_association
        JOIN Charges
            ON Charges.CourtID = ijis_court_item_association.to_ijis_court_item_id 
)
--This is the final output from all of the above queries (however many there are) 
--union all'ed together
SELECT * FROM Charges;