Использование CONNECT BY для получения всех родителей и одного ребенка в иерархии через SQL-запрос в Oracle - PullRequest
4 голосов
/ 31 марта 2010

Я просматривал несколько предыдущих постов об использовании CONNECT BY. Что мне нужно найти, так это то, что делать, если я хочу получить всех родителей (то есть, root) и только одного дочернего элемента для узла, скажем 4.

Похоже, мне придется использовать объединение следующих двух: -

 SELECT  * 
 FROM    hierarchy 
 START WITH id = 4
 CONNECT BY id = PRIOR parent
union
     SELECT  *
     FROM    hierarchy
     WHERE LEVEL =<2
     START WITH
     id = 4
     CONNECT BY
     parent = PRIOR id

Есть ли лучший способ сделать это, какой-нибудь обходной путь, который более оптимизирован?

1 Ответ

8 голосов
/ 31 марта 2010

Вы должны быть в состоянии сделать это, используя дополнительный выбор (и DISTINCT), чтобы найти всех потомков 4:

Select Distinct *
From hierarchy
Start With id In ( Select id
                   From hierarchy
                   Where parent = 4 )
Connect By id = Prior parent

Используя UNION, вы можете хотя бы удалить CONNECT BY из вашего второго запроса:

  Select *
  From hierarchy
  Start With id = 4
  Connect By id = Prior parent
Union
  Select *
  From hierarchy
  Where parent = 4

Никогда не используйте SELECT *, всегда называйте столбцы, которые вам действительно нужны. Это облегчает чтение, обслуживание и оптимизацию вашего запроса.

...