Предположим, у нас есть таблица T , которая представляет ребра (неориентированного) графа. Существует два столбца X и Y , где запись в столбце X является начальным узлом, а запись в Y - конечным узлом .
Например, следующий график:
Может быть представлен следующей таблицей:
|-----|----|
| X | Y |
|-----|----|
| a | e |
| b | c |
| d | c |
|-----|----|
Можно ли использовать запрос SQL для создания таблицы, содержащей все ребра всех непересекающихся полных графов, подразумеваемых T ? То есть график генерируется из T путем соединения любых двух узлов с ребром, если между ними существует некоторый путь (любой длины!).
Для приведенного выше примера завершенный граф будет выглядеть так:
И таблица может быть:
|-----|----|
| X | Y |
|-----|----|
| a | e |
| b | c |
| d | c |
| b | d |
|-----|----|
В общем, у меня складывается впечатление, что это нельзя сделать с помощью запроса SQL без использования какого-либо рекурсивного общего табличного выражения. Используя al oop, проблему можно решить, соединив T с самим собой, чтобы сгенерировать список узлов, соединенных путем длиной 2, и затем снова соединить его для путей длины 3 et c. ., остановка после n шагов, где n - количество узлов.
Однако я не думаю, что такие циклы возможны в "стандартном" SQL , Есть ли идиоматический c SQL способ сделать это?