여기 내 시나리오가 있습니다. 두 개의 테이블 "Car"와 "CarPart"가 있다고 가정 해 봅시다. 자동차는 많은 부품으로 구성되며 각 부품은 여러 자동차에 속할 수 있습니다. 제 경우의 한 가지 복잡한 점은 각 부품이 동일한 부품 이름이더라도 새 부품 ID를 얻지 만 간단히 다른 자동차에 속하는 것입니다. 이것은 내가 통제 할 수없는 일이기 때문에 나와 함께 감내하십시오. 여기에 일을 설정하는 스크립트가 있습니다.어려운 재귀 T-SQL 쿼리
IF OBJECT_ID('Car') IS NOT NULL DROP TABLE Car
CREATE TABLE Car (
CarID INT,
CarName VARCHAR(16)
)
IF OBJECT_ID('CarPart') IS NOT NULL DROP TABLE CarPart
CREATE TABLE CarPart (
PartID INT,
PartName VARCHAR(16),
CarID INT
)
INSERT INTO Car
VALUES (1, 'Chevy'),
(2, 'Ford'),
(3, 'Toyota'),
(4, 'Honda'),
(5, 'Nissan'),
(6, 'Hugo')
INSERT INTO CarPart
VALUES (110, 'Engine', 1),
(120, 'Engine', 2),
(210, 'Door', 1),
(220, 'Door', 3),
(310, 'Seat', 4),
(320, 'Seat', 5),
(410, 'Window', 3),
(510, 'Wheel', 2),
(420, 'Window', 6)
당신이 볼 수 있듯이, 부분 "엔진"에 모두 '시보레'와 '포드'에 속하는 다른 ID가 두 번 나열됩니다. 다시 한번, 이것은 내가 살아야만하는 디자인상의 한계입니다.
나는 여기에 내가 필요로하는 것이있다 : 주어진 차, 나는이 차를위한 모든 부품과이 부품들이 속한 다른 모든 차를 찾아야한다. 체인 끝까지 부품과 자동차를 반복적으로 찾아야합니다. 논리는 다음과 같이 요약 될 수 있습니다 : @StartCar -> @StartCar의 파트 -> 같은 이름의 다른 파트 -> "다른"파트의 ID 가져 오기 -> 그 파트를 소유 한 자동차 가져 오기 - 체인의 끝까지 도달 할 때까지 반복합니다.
DECLARE @StartCar VARCHAR(16) = 'Chevy'
;WITH cte (CarName, PartName)
AS
(
SELECT c.CarName,
cp.PartName
FROM CarPart cp
JOIN Car c ON cp.CarID = c.CarID
WHERE c.CarName = @StartCar
UNION ALL
SELECT c.CarName,
cp.PartName
FROM CarPart cp
JOIN Car c ON cp.CarID = c.CarID
JOIN cte cte ON cp.PartName = cte.PartName
)
SELECT CarName, PartName
FROM cte
그러나, 그것은 무한 루프에 얻고 종료 :
내 문제를 해결하기 위해,이 쿼리를 시도했다. 출력이 다음과 비슷할 것으로 예상됩니다.CarName PartName
Chevy Engine
Chevy Door
Ford Engine
Ford Wheel
Toyota Door
Toyota Window
Hugo Window
나는 모든 포인터를 사용합니다.
감사합니다.
예제 데이터로 실행 가능한 스크립트를 제공하는 경우 +1 –