Я подозреваю, что этот вопрос мертв, но здесь идет.
Судя по комментариям, возможно, было некоторое недопонимание того, что здесь делается. Похоже, что таблица ссылок генерируется парами. В сущности, Ссылки представляют собой раздел Предметов, основанный на связи «в паре с».
Вот частичный ответ (в том смысле, что он создает таблицу ссылок, как показано, но, возможно, не самый эффективный). Возможно, кто-то может улучшить это.
DECLARE @pairs TABLE (ItemA INT, ItemB INT)
INSERT INTO @pairs (ItemA, ItemB) VALUES ( 1, 2)
INSERT INTO @pairs (ItemA, ItemB) VALUES ( 1, 3)
INSERT INTO @pairs (ItemA, ItemB) VALUES ( 4, 5)
INSERT INTO @pairs (ItemA, ItemB) VALUES ( 4, 6)
INSERT INTO @pairs (ItemA, ItemB) VALUES ( 6, 2)
INSERT INTO @pairs (ItemA, ItemB) VALUES ( 7, 8)
INSERT INTO @pairs (ItemA, ItemB) VALUES ( 9, 2)
INSERT INTO @pairs (ItemA, ItemB) VALUES ( 9, 10)
INSERT INTO @pairs (ItemA, ItemB) VALUES (11, 12)
INSERT INTO @pairs (ItemA, ItemB) VALUES (11, 13)
INSERT INTO @pairs (ItemA, ItemB) VALUES (14, 15)
DECLARE @links TABLE (Link INT, Item INT)
DECLARE @nextItem INT
DECLARE @nextLink INT
SET @nextLink = 0
DECLARE @itemsLeft BIT
SET @itemsLeft = 1
DECLARE @insertCount INT
WHILE @itemsLeft = 1
BEGIN
-- Get the next Item not already in a link
SELECT @nextItem = MIN(allItems.Item)
FROM (SELECT ItemA AS Item FROM @pairs UNION SELECT ItemB FROM @pairs) AS allItems
LEFT JOIN @links l ON l.Item = allItems.Item
WHERE l.Link IS NULL
SET @nextLink = @nextLink + 1
IF (@nextItem IS NOT NULL)
BEGIN
-- There will be at least 1 new link
INSERT INTO @links (Link, Item) VALUES (@nextLink, @nextItem)
SET @insertCount = 1
-- Keep going until no new Items found...
WHILE (@insertCount > 0)
BEGIN
INSERT INTO @links (Link, Item)
SELECT la.Link, p.ItemB
FROM @pairs p
INNER JOIN @links la ON la.Item = p.ItemA
LEFT JOIN @links lb ON lb.Item = p.ItemB
WHERE lb.Link IS NULL
SET @insertCount = @@ROWCOUNT
INSERT INTO @links (Link, Item)
SELECT lb.Link, p.ItemA
FROM @pairs p
INNER JOIN @links lb ON lb.Item = p.ItemB
LEFT JOIN @links la ON la.Item = p.ItemA
WHERE la.Link IS NULL
SET @insertCount = @insertCount + @@ROWCOUNT
END
END
ELSE
SET @itemsLeft = 0
END
SELECT * FROM @links ORDER BY 1,2