Получить последних детей из базы данных

Моя ситуация:

Table A
(
ID
Parent_Id
TimeStamp
)

Корень имеет значение Parent_Id null, а у детей - идентификатор его отца.

Я просто хочу получить всех ПОСЛЕДНИХ детей за каждым столом А. Отец и дети, которых я не хочу. (кроме последнего).

Можно ли построить SQL, чтобы получить это?

PS: я на sql в любом месте 11. Может быть, ANSI SQL может решить эту проблему, я не уверен.

РЕДАКТИРОВАТЬ: (отредактировано, чтобы дать дополнительную информацию) Я не хочу последних детей из элемента.

Пример:

Id 1 Parent NULL

Id 2 Parent 1

Идентификатор 3 (последний ребенок) Родитель 1

Id 4 Parent NULL

Id 5 (последний ребенок) родитель 4

Я хочу получить: Id 3 Id 5

4 ответа

Решение

Использование сохраненной функции

create function LastChild(in parent integer)
returns integer
begin
    declare res integer;  
    select top 1 id into res from TableA where parent_id = parent order by timeCol desc;
    return res;
end

Выбрать

select Id, lastchild(id) from TAbleA where parent_id is null

Я буду работать над другим решением без сохраненной функции.

РЕДАКТИРОВАТЬ: без сохраненной функции:

select Id, (select top 1 id from TableA childs where parent_id = TableA.id order by timeCol desc) from TableA where parent_id = 0

Если под "последними детьми" вы подразумеваете элементы, которые сами по себе не имеют дочерних элементов (и часто упоминаются как элементы конечного уровня), что-то вроде этого должно сделать:

SELECT ID
 from A
 where ID not in (select Parent_Id from A)

Коррелированную версию подзапроса немного сложнее понять, но она будет работать быстрее на больших таблицах:

SELECT ID
 from A OuterReference
 where not exists (select 1 from A where Parenti_ID = OuterReference.ID)

("OuterReference" является псевдонимом для таблицы A)

Я использую SQL Server, но это довольно простой синтаксис и должен работать для вас с минимальными изменениями.

select * from a where id not in (select parent_id from table a)

Другими словами, выберите все из таблицы а, где идентификатор элемента не является родительским идентификатором какого-либо другого элемента. Это даст вам все листовые узлы графа.

РЕДАКТИРОВАТЬ:
Ваше редактирование немного сбивает с толку, и идентификаторы, как правило, не используются в качестве механизмов упорядочения, но независимо от того, что приведенный вами пример может быть выполнен с помощью этого запроса

SELECT MAX( id )
FROM a
WHERE id NOT IN
  (SELECT parent_id
      FROM a
      WHERE parent_id IS NOT NULL
  )
GROUP BY parent_id

Мне пришлось немного обновить запрос, чтобы получить только дочерние категории, для Postgres 9.4

      select count(id) from A as outer_ref where not exists(
    select 1 from A where parent_id=outer_ref.id) and parent_id is not null;
Другие вопросы по тегам