У меня есть график в моей базе данных PostgreSQL, для примера давайте определим его так:
CREATE TABLE nodes (node_id INTEGER);
CREATE TABLE roads (road_id INTEGER, nodes INTEGER[]);
INSERT INTO nodes VALUES (1), (2), (3), (4), (5);
INSERT INTO roads VALUES (1, {1, 2}), (2, {3, 4}));
Я хочу создать SQL-запрос, который возвращает количество подключенных компонентов графа, в в этом примере число равно 3, потому что узлы 1/2 соединены, 3/4 также, а 5 ни с чем не соединены.
Я попытался найти реализации find&union в SQL, но безрезультатно, затем я обратился к CTE, но я не могу сделать это самостоятельно, я думал что-то вроде этого:
WITH RECURSIVE cc(iterator_id, node_id, rank, iterator) AS
(
SELECT row_number() OVER(), n.node_id, row_number() OVER (), 1 FROM nodes AS n
UNION ALL
# Something here that does the magic
)
SELECT
COUNT(DISTINCT rank) AS no_of_cc
FROM
cc,
(SELECT COUNT(*) FROM nodes) AS last_iterator_id
WHERE iterator = last_iterator_id;
где на каждой итерации мы обновляем ранги строк, у которых iterator_id ‹= iterator. Мы повторяем до тех пор, пока iterator
не сравняется с наибольшим iterator_id
, но я не могу думать о рекурсивной части.
Можете ли вы помочь мне найти количество подключенных компонентов?