Действительно ли возможно сделать рекурсивный SQL-запрос?

ConcurrentHashMap или ConcurrentLinkedQueue или ConcurrentSkipListMap может быть другой опцией, потому что они никогда не будут бросать любое ConcurrentModificationException, даже если вы удалите или добавите элемент.

62
задан a_horse_with_no_name 3 August 2014 в 12:34
поделиться

11 ответов

Существует несколько способов сделать то, в чем Вы нуждаетесь в PostgreSQL.

Что-то вроде этого:

create or replace function example_subtree (integer)
returns setof example as
'declare results record;
         child record;
 begin
  select into results * from example where parent_id = $1;
  if found then
    return next results;
    for child in select id from example
                  where parent_id = $1
      loop
        for temp in select * from example_subtree(child.id)
        loop
          return next temp;
        end loop;
      end loop;
  end if;
  return null;
end;' language 'plpgsql';

select sum(value) as value_sum
  from example_subtree(1234);
11
ответ дан 24 November 2019 в 16:44
поделиться

Если необходимо сохранить произвольные графики, не только иерархии, Вы могли бы продвинуть Пост-ГРЭС стороне и попробовать базу данных графика такой как AllegroGraph:

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

Это не интегрируется хорошо с чем-то, любят, в спящем режиме или Django ORM, но если Вы серьезно относитесь к структурам графика (не только, иерархии как модель Nested Set дают Вам), проверяют его.

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

-1
ответ дан Jacob Rigby 24 November 2019 в 16:44
поделиться

Я думаю, что это легче в SQL 2008 с HierarchyID

0
ответ дан Gulzar Nazim 24 November 2019 в 16:44
поделиться

Так же, как резюме в стороне, хотя на вопрос ответили очень хорошо, нужно отметить это, если мы рассматриваем это как a:

универсальный вопрос о SQL

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

1
ответ дан Dr.Pil 24 November 2019 в 16:44
поделиться

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

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

0
ответ дан George Mauer 24 November 2019 в 16:44
поделиться

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/ora/sql/connect_by.html

1
ответ дан jason saldo 24 November 2019 в 16:44
поделиться

Следующие компиляции кода и это протестировали OK.

create or replace function subtree (bigint)
returns setof example as $
declare
    results record;
    entry   record;
    recs    record;
begin
    select into results * from example where parent = $1;
    if found then
        for entry in select child from example where parent = $1 and child  parent loop
            for recs in select * from subtree(entry.child) loop
                return next recs;
            end loop;
        end loop;
    end if;
    return next results;
end;
$ language 'plpgsql';

условие "дочерний <> родитель" необходим в моем случае, потому что узлы указывают себе.

Весело проводят время :)

2
ответ дан Richard Gomes 24 November 2019 в 16:44
поделиться

Если Ваш SQL Server использования 2005, существует действительно прохладный способ сделать эту использующую Общую Таблицу Выражения.

Это вынимает все gruntwork из составления временной таблицы, и basicly позволяет Вам делать все это только с С и ОБЪЕДИНЕНИЕ.

Вот хорошее учебное руководство:

http://searchwindevelopment.techtarget.com/tip/0,289483,sid8_gci1278207,00.html

5
ответ дан FlySwat 24 November 2019 в 16:44
поделиться

Если Вы захотите портативное решение, которое будет работать над любым ANSI SQL-92 RDBMS, необходимо будет добавить новый столбец к таблице.

Joe Celko является исходным автором Вложенные Наборы подход к хранению иерархий в SQL. Вы можете, Google "вложил наборы" иерархия для понимания больше о фоне.

Или можно просто переименовать порожденный к leftid и добавить , исправился .

Вот моя попытка суммировать Вложенные Наборы, которые горестно потерпят неудачу, потому что я не Joe Celko: SQL является основанным на наборе языком, и модель смежности (хранящий родительский идентификатор) НЕ является основанным на наборе представлением иерархии. Поэтому нет никакого чистого основанного на наборе метода для запросов схемы смежности.

Однако , большинство основных платформ представило расширения в последние годы для контакта с этой точной проблемой. Таким образом, если кто-то отвечает с Определенным для пост-ГРЭС решением, используйте это любой ценой.

15
ответ дан Portman 24 November 2019 в 16:44
поделиться

Начиная с версии 8.4 PostgreSQL имеет поддержка рекурсивного запроса для общих выражений таблицы с помощью стандарта SQL WITH синтаксис.

34
ответ дан Dave Jarvis 24 November 2019 в 16:44
поделиться

используйте , общий май выражения .

таблицы хочет указать, что это - SQL Server 2005 или выше только. Dale Ragan

вот статья о рекурсии SqlTeam без общих выражений таблицы.

5
ответ дан Community 24 November 2019 в 16:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: