Можно ли сделать рекурсивный запрос SQL? - PullRequest
62 голосов
/ 10 сентября 2008

У меня есть таблица, похожая на эту:

CREATE TABLE example (
  id integer primary key,
  name char(200),
  parentid integer,
  value integer);

Я могу использовать поле парентид, чтобы упорядочить данные в древовидную структуру.

Теперь вот что я не могу отработать. Имея парентиду, можно ли написать оператор SQL, чтобы сложить все поля значений в этой парентиде и переписать ветвь дерева?

ОБНОВЛЕНИЕ: Я использую posgreSQL, поэтому мне не нравятся необычные функции MS-SQL. В любом случае, я бы хотел, чтобы это воспринималось как общий вопрос SQL.

Кстати, я очень впечатлен тем, что получил 6 ответов в течение 15 минут после постановки вопроса! Переполнение стека Go!

Ответы [ 14 ]

1 голос
/ 10 сентября 2008

Oracle имеет «НАЧАТЬ С» и «ПОДКЛЮЧИТЬ ПО»

select 
    lpad(' ',2*(level-1)) || to_char(child) s

from 
    test_connect_by 

start with parent is null
connect by prior child = parent;

http://www.adp -gmbh.ch / ора / SQL / connect_by.html

0 голосов
/ 10 сентября 2008

Если вам нужно хранить произвольные графики, а не только иерархии, вы можете отодвинуть Postgres в сторону и попробовать базу данных графиков, такую ​​как AllegroGraph :

Все в базе данных графа хранится как тройка (исходный узел, ребро, целевой узел), и это дает вам первоклассную поддержку для манипулирования структурой графа и выполнения запросов с использованием языка, подобного SQL.

Он плохо интегрируется с чем-то вроде Hibernate или Django ORM, но если вы серьезно относитесь к структурам графов (не только к иерархиям, которые дает вам модель Nested Set), проверьте это.

Я также считаю, что Oracle наконец-то добавила поддержку реальных графов в свои последние продукты, но я удивлена, что это заняло так много времени, и эта модель может принести пользу многим проблемам.

0 голосов
/ 10 сентября 2008

Я думаю, что это проще в SQL 2008 с HierarchyID

0 голосов
/ 10 сентября 2008

это SQL Server? Не могли бы вы написать хранимую процедуру TSQL, которая перебирает и объединяет результаты вместе?

Мне также интересно, есть ли способ сделать это только на SQL. Из битов, которые я помню из моего класса географических баз данных, должно быть.

...