我怀疑这个问题已经死了,但是这里有。
从 cmets 判断,可能对这里所做的事情存在一些误解。看起来链接表是由这些对生成的。实际上,链接代表基于“配对”关系的项目分区。
这是一个部分答案(从某种意义上说,它创建了如图所示的链接表,但可能不是最有效的)。也许有人可以对此进行改进。
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