Поиск всех уникальных путей отношений в таблице сопоставления с помощью Oracle SQL - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть набор данных, который выглядит примерно так:

            id_a                                 id_b
  (1) jkshdgvksjhsjk8983298jhsdhj          llkmlkmsdgsdf97897998
  (2)  llkmlkmsdgsdf97897998             sdkjvhkasdk3298798kjdjsk               
  (3) jkshdgvksjhsjk8983298jhsdhj      yiuyweruiyriueshjdbvjh89238
  (4) cxmnvbmnxmbnxcv4398744jskdhk         bxcmnvbnmxcweuiy84398

В моем наборе данных нет ключей, кроме комбинаций атрибутов (т. Е. Строка 1 указывает на связь между id_a и id_b в этом строка, то же самое для строки 2, et c.). Кроме того, данные являются иерархическими - в строке 1 id_a относится к id_b. В строке 2 id_b из строки 1 теперь является id_a и связан с id_b в строке 2 (то есть теперь существует иерархическое отношение: jkshdgvksjhsjk8983298jhsdhj -> llkmlkmsdgsdf97897998 -> sdkjvhkasdk3298798kjdjsk ).

Существует также связь между llkmlkmsdgsdf97897998 (id_b из строки 1 и id_a из строк 2 и 3) и другим идентификатором ( yiuyweruiyriueshjdbvjh89238 ), таким что llkmlkmsdgsdf97897998 теперь является частью следующего пути взаимосвязи:

(1) jkshdgvksjhsjk8983298jhsdhj -> llkmlkmsdgsdf97897998 --k * 10h sk 10h7hdk 10h7xdh1024

Первый элемент этого пути ( jkshdgvksjhsjk8983298jhsdhj ) является частью другого пути: jkshdgvksjhsjk8983298jhsdhj -> yiuyhhdwjwjjjjjtjjjjjjjjjjjjjjhjjjjjjjjjhjjhjjjjjjjhjjhjjjjjjhjjjjhjjjjjhjjhjjhjjhjjhjjhjjhjjhjjhjjhjjhjjhjjjjjjjjjjjjjjjjjjjjjjjjjjhjjjjjjjjjjhtjs * В моем выводе я хотел бы показать оба этих пути , а также путь, представленный отношением в строке 4 ( cxmnvbmnxmbnxcv4398744jskdhk -> bxcmnvbnmxcweuiy84398 ) но я НЕ хочу показывать путь промежуточных отношений ( llkmlkmsdgsdf97897998 -> sdkjvhkasdk3298798kjdjsk ), поскольку он будет перезаписан Дант.

Каков наилучший способ создать список этих уникальных путей, чтобы все иерархические отношения были захвачены (независимо от количества уровней в иерархии - мои данные могут иметь более 50 уровней) и дочерние / низкоуровневые отношения нет? Спасибо, и, пожалуйста, дайте мне знать, если я смогу уточнить.

1 Ответ

0 голосов
/ 26 февраля 2020

Это должно быть:

select connect_by_root(id_a) root, id_b
  from your_table
  where connect_by_isleaf = 1
  start with not exists (select 1 from your_table x where id_b = your_table.id_a)
  connect by prior id_b = id_a

dbfiddle

connect_by_root показывает первый идентификатор в иерархии. connect_by_isleaf = 1 скрывает все промежуточные строки. start_with заставляет запрос начинаться только с корней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...