这是我的场景。假设我有两个表“Car”和“CarPart”。汽车由许多零件组成,每个零件可以属于多辆汽车。在我的例子中,一个复杂的问题是每个部件都有一个新的 PartID,即使它是相同的部件名称,但它只是属于不同的汽车。这是我无法控制的事情,所以请耐心等待。这是设置内容的脚本。
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)
如您所见,“Engine”部分属于“Chevy”和“Ford”,并以不同的 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
我很感激任何指示。
谢谢!