यहाँ मेरी परिदृश्य है। मान लें कि मेरे पास दो टेबल "कार" और "कारपार्ट" हैं। कार में कई हिस्सों होते हैं और प्रत्येक भाग कई कारों से संबंधित हो सकता है। मेरे मामले में एक जटिलता यह है कि प्रत्येक भाग को एक नया पार्टिड मिलता है, भले ही यह एक ही भाग का नाम हो, लेकिन यह केवल एक अलग कार से संबंधित है। यह ऐसा कुछ है जिस पर मेरा कोई नियंत्रण नहीं है, इसलिए बस मेरे साथ सहन करें। चीजों को सेट करने के लिए स्क्रिप्ट यहां दी गई है।चुनौतीपूर्ण पुनरावर्ती टी 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 के पार्ट्स -> इसी नाम से अन्य भागों -> मिल ईद उन "अन्य" भागों के के -> कार जो "स्वयं" उन भागों प्राप्त करें - -> शुरू होने और श्रृंखला के अंत तक पहुंचने तक दोहराना।
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 उदाहरण डेटा के साथ निष्पादन योग्य स्क्रिप्ट प्रदान करने के लिए +1 –