Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Может кто-то знает алгоритм / 7 сообщений из 7, страница 1 из 1
11.07.2007, 09:27
    #34652236
Может кто-то знает алгоритм
Пусть есть таблица (id, parentid)
где
id - уникальный идентификатор
parentid - идентификатор родительского элемента (NULL, если это корень)

Может кто подскажет, возможно ли построить на SQL-92 запрос, который вернет
пару
(id, rootid), где rootid - корневой элемент для id
...
Рейтинг: 0 / 0
11.07.2007, 09:34
    #34652255
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может кто-то знает алгоритм
Виталий Руссинковскийвозможно ли построить на SQL-92
Нет. Точнее, можно только если максимальная высота дерева ограничена и заранее известна.

P.S. Ну а за желание делать что-то "на SQL-92", равно как и на "SQL-более поздних" вне сугубо учебных заданий следует.....
...
Рейтинг: 0 / 0
11.07.2007, 11:54
    #34652751
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может кто-то знает алгоритм
Вот на Firebird 2.0 (наверняка не совместим со стандартом SQL-92, но кто совместим в наше время?)
таблица:
Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE OBJECT (
       ID BIGINT NOT NULL,
       PARENTID BIGINT,
       CONSTRAINT PK_OBJECT PRIMARY KEY (ID)
);
ALTER TABLE OBJECT ADD CONSTRAINT FK_OBJECT_1 FOREIGN KEY (PARENTID) REFERENCES OBJECT(ID);
Процедура получения корня:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE PROCEDURE ROOT (ID BIGINT)
returns (ROOTID BIGINT)
AS 
  declare variable ParentID BigInt;
begin
for select ParentID from object where (ID=:ID) into :ParentID do
begin
  if (ParentID is NULL) then
  begin
    RootID = ID;
    suspend;
  end else
  begin
    for select RootID from Root(:ParentID) into :RootID do
    begin
      suspend;
    end
  end
end
end
запрос:
Код: plaintext
1.
select ID, ParentID, RootID from object
left join Root(ID) on ID=ID
...
Рейтинг: 0 / 0
11.07.2007, 14:13
    #34653412
Может кто-то знает алгоритм
Я понимаю, что с помошью хранимой процедуры это можно сделать. Вопрос в том - можно ли это сделать с помощью запроса
...
Рейтинг: 0 / 0
11.07.2007, 14:16
    #34653425
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может кто-то знает алгоритм
Можно. Забыв про SQL-92
...
Рейтинг: 0 / 0
12.07.2007, 11:47
    #34655793
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может кто-то знает алгоритм
Виталий Руссинковский пишет:
> Я понимаю, что с помошью хранимой процедуры это можно сделать. Вопрос в
> том - можно ли это сделать с помощью запроса

На стандартном - нельзя. Только с использованием т.р. рекурсивных
запросов. Типа CONNECT BY в оракле.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
16.07.2007, 10:48
    #34660252
MishenkovKS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может кто-то знает алгоритм
Или добавить транзитивное замыкание на эту таблицу - и тогда можно запросом
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Может кто-то знает алгоритм / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]