작업을 함께 연결하는 테이블이 있습니다.
JobToJob
(
JobToJobId int
SourceJobId int
DestinationJobId int
)
작업에는 여러 대상 작업 (즉, 하나 이상의 JobToJob 레코드)이있을 수 있지만 소스 작업은 하나만 있습니다. 그래서 이것은 트리 구조를 만듭니다. 루트 레코드는 다른 레코드에 DestinationJobId 항목이없는 레코드로 정의됩니다.
내가 가진 요구 사항은 제공된 작업 ID에 대한 전체 트리를 검색하는 것입니다. 나는 이것을 두 부분으로 나누었습니다.
재귀 CTE를 사용하여 이것을 시도해 보았지만 아무데도 얻지 못했습니다. 저장 프로 시저를 사용하여이 작업을 수행 할 수 있다는 것을 알고 있지만 작업 속도를 늦추는 경향이 있으므로이를 피하려고합니다.
나보다 더 재귀적인 CTE 경험을 가진 사람이 이것에 접근하는 가장 좋은 방법에 대한 제안을 받았습니까?
건배,
Rob
Jobs 테이블이 있기를 바랍니다.
declare @JobId int
;with getAscendants( job, parent, inverseDepth)
as
(
select jj.DestinationJobId, jj.SourceJobId, 1
from JobToJob jj
where jj.DestinationJobId = @JobId
union all
select jj.DestinationJobId, jj.SourceJobId, inverseDepth + 1
from getAscendants
join JobToJob jj on jj.DestinationJobId = getAscendants.parent
)
,rootFinder( job)
as
(
select j.JobId
from Jobs j
where j.JobId = coalesce
(
(
select top 1 parent from getAscendants order by inverseDepth desc
)
, @JobId
)
)
,getDescendants( job, parent)
as
(
select j.JobId, null
from Jobs j
cross apply rootFinder
where j.JobId = rootFinder.job
union all
select jj.DestinationJobId, jj.SourceJobId
from getDescendants
join JobToJob jj on jj.SourceJobId = getDescendants.job
)
select * from getDescendants
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다