
[dbo].[TransitiveClosure]
CREATE PROCEDURE [dbo].[TransitiveClosure]
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM related_topics
INSERT related_topics
SELECT
doc_id AS ancestor_id,
doc_id AS descendant_id
FROM document
WHERE
document.doc_type = 'Topic'
INSERT related_topics
SELECT DISTINCT
parent_id AS ancestor_id,
doc_id AS descendant_id
FROM outline
WHERE
parent_id IS NOT NULL
WHILE @@ROWCOUNT > 0
BEGIN
INSERT related_topics
SELECT DISTINCT outleft.ancestor_id, outright.descendant_id
FROM
related_topics AS outleft
JOIN
related_topics AS outright
ON
outleft.descendant_id = outright.ancestor_id
LEFT JOIN
related_topics AS duplist
ON
duplist.ancestor_id = outleft.ancestor_id AND
duplist.descendant_id = outright.descendant_id
WHERE
duplist.ancestor_id IS NULL
END
DELETE FROM related_topics
FROM document
JOIN related_topics
ON document.doc_id = related_topics.descendant_id
WHERE document.doc_type != 'Topic'
END
GO