Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите плз, очень надо  (Прочитано 14516 раз)
0 Пользователей и 1 Гость смотрят эту тему.
lelik
Гость
« : 29-01-2009 20:01 » 

Как написать рекурсивный запрос в с последовательным извлечением данных из таблицы в направлении:
- от корня иерархии к листьям
- от листьев к корню иерархии

Для SQL, Oracle и PostgreSQL( с использованием GiST)
Небольшой пример запросов хоть каких-нибудь для маленькой таблички
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 29-01-2009 20:09 » 

Легко:

SELECT * FROM SMALLESTTABLE
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 29-01-2009 20:16 » 

lelik, какие в таблице корни и листья ? Откуда они там ? Поподробнее
Записан

lelik
Гость
« Ответ #3 : 29-01-2009 20:18 » 

Таблица представляет собой древовидную структуру
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 29-01-2009 20:20 » 

а пример таблицы можно ?
Записан

McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #5 : 29-01-2009 20:22 » 

Таблица? Всего одна таблица и древовидная структура?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
lelik
Гость
« Ответ #6 : 29-01-2009 20:24 » 

Ну вот хотя бы такой простенький))
  ID        PID TITLE
---- ---------- --------------------
   1            Россия
   2          1 Воронеж
   3          2 ООО "Рога и копыта"
   4          1 Москва
   5          1 Лиски
   6          3 Главный офис
   7          3 Офис 1
   8          3 Офис 2
   9          8 Сервер 1
  10          5 ЛискиПресс
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 29-01-2009 20:26 » 

lelik, итак, а теперь необходимо задачу сформулировать )))
Записан

lelik
Гость
« Ответ #8 : 29-01-2009 20:29 » 

написать рекурсивный запрос который последовательно извлечет все данные из таблицы  от корня иерархии к листьям
и еще один тако же запрос только от листьев к корню
Записан
lelik
Гость
« Ответ #9 : 29-01-2009 20:30 » 

Именно так ворос сформулировал преподаватель
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 29-01-2009 20:32 » 

что в твоём понимании (или понимании препода Улыбаюсь ) есть "последовательно извлечет все данные из таблицы  от корня иерархии к листьям" и наоборот, покажи примеры таких выборок, что является целью выборки - ? Обычно есть цель, а просто так никто ничего не выбирает Улыбаюсь
Записан

lelik
Гость
« Ответ #11 : 29-01-2009 20:35 » 

скорей тогда не извлечет данные а просто выведет последовательно результат запроса

Цель выбрать все поля, только сначало по порядку от корня к листьям и наоборот
« Последнее редактирование: 29-01-2009 20:37 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 29-01-2009 20:37 » 

скорей тогда не извлечет данные а просто выведет последовательно результат запроса
то есть делаем запрос, потом стоит задача вывести данные. Тогда нужно знать среду программирования
Записан

lelik
Гость
« Ответ #13 : 29-01-2009 20:39 » 

SQL, Oracle или PostgreSQL  для любой из них, а если не затруднит то для каждой
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #14 : 30-01-2009 05:43 » 

ORACLE
используем connect by prior
от родителя
Код:
  select
   id,
   pid,
   name
  from
    myTable
  start with id = /окорневой узел или с какого искать/
  connect by prior id = pid

к родителю все тоже самое, только меняем
Код:
  connect by prior pid = id

SQL
все зависит от версии сервера, в 2000 напрямую запрос не сделать(надо писать ф-цию, или ХП, или, если конечное кол-во потомков, то нужное кол-во left join),  2005 и выше используем CTE
от родителя
Код:
with myTree(id, pid, name) as (
  select
    id, pid, name
  from
    myTable
  where
    id = /окорневой узел или с какого искать/
  union all
  select
    ch.id, ch.pid, ch.name
  from
    myTable ch
  inner join myTree p on ch.pid = p.id)
select
  id, pid, name
from
  MyTree

к родителю все тоже самое, только меняем
Код:
  inner join myTree p on ch.id = p.pid

PostgreSQL 
ничего не могу сказать, но, наверное, есть что-то подобное
Записан

I Have Nine Lives You Have One Only
THINK!
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 30-01-2009 05:45 » 

lelik, Oracle позволяет строить рекурсивные запросы. Смотри в статьях
https://club.shelek.ru/viewart.php?id=306
https://club.shelek.ru/viewart.php?id=307



Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
lelik
Гость
« Ответ #16 : 30-01-2009 05:46 » 

HandKot Спасибо огромное вы мне очень очень помогли
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 31-01-2009 11:52 » 

Причем, пример таблицы взят как раз из статьи...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines