我有一张表,里面有一份刑事指控清单。这些指控可以代替......例如,如果一个小伙子被指控犯有攻击罪,但在审判期间,受害人死亡,所以指控可以取代谋杀。< / 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,然后以某种方式递归做某事?但是,我希望可能有一种聪明的方法来实现这一目标。
希望有办法。
答案 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;