2017-12-04 18 views
2

아래 테이블 구조가 있습니다. 재귀 cte를 작성하여 맨 아래 테이블 결과를 얻고 싶습니다. 도움을 주셔서 감사합니다.모든 레코드를 찾을 수있는 재귀 CTE SQL Server

CREATE TABLE Jobcard (
    jobcard_id INT NOT NULL PRIMARY KEY, 
    jobcard_name varchar(20) NOT NULL, 
); 
CREATE TABLE Vehicle (
    vehicle_id INT NOT NULL PRIMARY KEY, 
    vehicle_name varchar(20) NOT NULL 
); 

CREATE TABLE Jobacard_vehicle (
    jobcard_id INT NOT NULL, 
    vehicle_id INT NOT NULL 
); 


INSERT INTO Jobcard (jobcard_id, jobcard_name) VALUES 
(1, 'Job1'),(2, 'Job2'),(3, 'Job3'), 
(4, 'Job4'),(5, 'Job5'),(6, 'Job6'), 
(7, 'Job7'),(8, 'Job8'),(9, 'Job9'); 

INSERT INTO Vehicle (vehicle_id, vehicle_name) VALUES 
(1, 'Vehicle1'),(2, 'Vehicle2'),(3, 'Vehicle3'), 
(4, 'Vehicle4'),(5, 'Vehicle5'),(6, 'Vehicle6'); 

INSERT INTO Jobacard_vehicle (jobcard_id, vehicle_id) VALUES 
(3, 1),(4, 2),(5, 3), 
(9, 6),(7, 2),(5, 4), 
(8, 4),(6, 1),(3, 5); 
jobcard_id, vehicle_id 
-------------------------- 
3   1 
4   2 
5   3 
9   6 
7   2 
5   4 
8   4 
6   1 
3   5 

I want to get this result from Jobacard_vehicle table when I pass the vehicle id as 3 as 

차량 ID (3)은 다시 차량 4 8 3 개 또는 이의 부분 jobcards 차량

jobcard_id, vehicle_id 
-------------------------- 
5   3 
5   4 
8   4 
하여 대해 참조 모든 작 w + 수단 작 w + 지칭 작 w + 5 작 w + 5 차량 4 데있다 갖는

감사합니다.

+0

Hi..First를 사용할 수 있다고 생각 Job->Vehicle->Job->Vehicle->...을 확인해야 할 경우 다음 재귀

DECLARE @startVehicleID int=3 ;WITH vehCTE AS( SELECT jobcard_id,vehicle_id,CAST(CONCAT('(',jobcard_id,',',vehicle_id,')') AS varchar(MAX)) [path] FROM Jobacard_vehicle WHERE [email protected] UNION ALL SELECT v.jobcard_id,v.vehicle_id,c.[path]+CONCAT('(',v.jobcard_id,',',v.vehicle_id,')') FROM Jobacard_vehicle v JOIN vehCTE c ON (v.jobcard_id=c.jobcard_id OR v.vehicle_id=c.vehicle_id) AND CHARINDEX(CONCAT('(',v.jobcard_id,',',v.vehicle_id,')'),c.[path])=0 ) SELECT * FROM vehCTE ORDER BY [path] 

에서 그것을 확인 스크립트로 질문 해 주신 것에 대해 감사드립니다. – Shammas

+0

이 목표를 달성하기 위해 이미 작성한 스크립트가 있습니까? 내 말은 당신이 개발 한 스크립트에 어떤 문제가 있다는 뜻입니까? – Shammas

+0

친구 안녕하세요, 그래 나는이 스크립트를 사용하려고했다, ( SELECT jobcard_id, vehicle_id Jobacard_vehicle FROM B2M 로 임시 함께 WHERE Jobacard_vehicle FROM vehicle_id = 3 UNION ALL SELECT bi.jobcard_id, bi.vehicle_id bi JOIN temp x on bi.jobcard_id = x.jobcard_id AND x.vehicle_id <> bi.vehicle_id select * 임시 옵션 (maxrecursion 0) – inspiedar

답변

1

시도의 전체 경로를 저장하고 나는 당신이 모든 다음

DECLARE @startVehicleID int=3 

;WITH vehCTE AS(
    SELECT 
     jobcard_id, 
     vehicle_id, 
     CAST(CONCAT('(',jobcard_id,',',vehicle_id,')') AS varchar(MAX)) [path], 
     1 NextIsJob 
    FROM Jobacard_vehicle 
    WHERE [email protected] 

    UNION ALL 

    SELECT 
     v.jobcard_id, 
     v.vehicle_id, 
     c.[path]+CONCAT('(',v.jobcard_id,',',v.vehicle_id,')'), 
     IIF(c.NextIsJob=1,0,1) 
    FROM Jobacard_vehicle v 
    JOIN vehCTE c ON ((c.NextIsJob=1 AND v.jobcard_id=c.jobcard_id) OR (c.NextIsJob=0 AND v.vehicle_id=c.vehicle_id)) AND CHARINDEX(CONCAT('(',v.jobcard_id,',',v.vehicle_id,')'),c.[path])=0 
) 
SELECT * 
FROM vehCTE 
ORDER BY [path] 
+0

고마워요. 그것은 예상대로 일했습니다. – inspiedar

+0

당신은 환영합니다! 그리고'@startVehicleID int = 1'을 참조하십시오. 이 경우 두 개의 시작점과 두 개의 다른 경로가 있습니다. 너 평범한거야? – Leran2002