. min master CTE .
;WITH minmaster as (select MIN(MASTER) master
FROM myTable)
select distinct m.master
, i.dupe
from minmaster m
cross join (select dupe dupe from myTable union all select master from myTable) i
WHERE i.dupe <> m.master
Update:
, , . - ( ), , , , . , - .
;WITH myTable AS
(SELECT 2 MASTER, 7 dupe
UNION all SELECT 3, 6
UNION all SELECT 6, 7
UNION all SELECT 20, 25
UNION all SELECT 75, 25
UNION all SELECT 100, 125
UNION all SELECT 150, 300
UNION all SELECT 180, 300
)
, cte AS
(
SELECT m.master L, m.dupe R, ROW_NUMBER() OVER (ORDER BY master) rnkC
FROM myTable m
)
, cte2 AS
(
SELECT m.master L, m.dupe R, ROW_NUMBER() OVER (ORDER BY master) rnkC2
FROM myTable m
)
, cteCur AS
(
SELECT TOP 1 cte.l, cte.R, cte.rnkC
FROM cte
UNION ALL
SELECT
CASE WHEN cteCur.r IN (SELECT dupe
FROM myTable
WHERE MASTER <> cteCur.L AND dupe = cteCur.R)
THEN cteCur.L
ELSE (SELECT cte2.L
FROM cte2
WHERE cte2.rnkC2 = cteCur.rnkC + 1)
END
, CASE WHEN cteCur.r IN (SELECT dupe
FROM myTable
WHERE MASTER <> cteCur.L AND dupe = cteCur.R)
THEN (SELECT cte2.L
FROM cte2
WHERE cte2.R = cteCur.R AND cte2.L <> cteCur.L)
ELSE (SELECT cte2.R
FROM cte2
WHERE cte2.rnkC2 = cteCur.rnkC + 1)
END
, cteCur.rnkC + 1
FROM cteCur
WHERE cteCur.L IS NOT NULL
)
SELECT cteCur.L Master
, cteCur.R Dupe
FROM cteCur
WHERE L IS NOT NULL
ORDER BY L, R