Получить последних детей из базы данных
Моя ситуация:
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;