Please post test data in a comsumable format:
CREATE TABLE #temp
(
article varchar(20) NOT NULL
,part varchar(20) NOT NULL
);
INSERT INTO #temp
VALUES ('article1', 'article1a')
,('article1', 'article1b')
,('article2', 'article1a')
,('article2', 'article2b')
,('article2b', 'article3a')
,('article2b', 'article3b');
I fail to see how you can get your results from the test data.
Try playing with something like:
WITH Parts
AS
(
SELECT DISTINCT
CAST(NULL AS varchar(20)) AS parent
,article
,1 AS hlevel
FROM #temp A
WHERE NOT EXISTS
(
SELECT 1
FROM #temp A1
WHERE A1.part = A.article
)
UNION ALL
SELECT A.article, A.part, P.hlevel + 1
FROM #temp A
JOIN Parts P
ON A.article = P.article
)
,PartNos
AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY hlevel, parent, article) AS RN
,parent, article
FROM Parts
WHERE parent IS NOT NULL
)
SELECT P.RN, P1.RN AS ParentRN
,P.parent as article
,P.article as part
FROM PartNos P
LEFT JOIN PartNos P1
ON P.parent = P1.article
ORDER BY RN;