Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по SQL...Скорей всего простейший


Хлам ©   (2003-09-03 10:31:00) 

Здравствуйте, уважаемые...Поговорим опять о деревьях. Вот есть такое:
ID/ PARENTID
1/0
2/1
3/1
4/0
5/4
6/0
7/6
8/6

Надо бы запрос, который бы в результате имел такое:
1 - 2 (т.к. 2 сына)
4 - 1(т.к. 1 сын)
6 - 2 (т.к. 2 сына)

Информацию вида (т.к. 2 сына) и т.п. конечно в результат включать не надо, это я так, для наглядности


Danilka   (2003-09-03 11:42:00) [1]

stone © (03.09.03 11:25)
там соединения совсем по-другому.

вот примеры из документации:
--------
Self Join Example
The following query uses a self join to return the name of each employee along with the name of the employee"s manager:

SELECT e1.ename||" works for "||e2.ename
"Employees and their Managers"
FROM emp e1, emp e2 WHERE e1.mgr = e2.empno;

Outer Join Examples
This query uses an outer join to extend the results of the Equijoin example above:

SELECT ename, job, dept.deptno, dname
FROM emp, dept
WHERE emp.deptno (+) = dept.deptno;
--------
По-этому я и не знаю, что означают left/rigth join, точнее, чем они отличаются. :))
Вот, сейчас заказываю книжку "Мир Интербазе", раз начал с ним работать, может там чего написано будет. :))


stone   (2003-09-03 11:42:00) [2]

Хлам (03.09.03 11:34) [16]

вообще-то для этого HAVING не нужен
select a.id, a.parentid, count(b.parentID) from tbl_name a left join tbl_name b on a.ID = b.parentID where a.parentid=0 group by a.id, a.parentid


Хлам   (2003-09-03 11:38:00) [3]

А вот что...Раз уж заговорили о деревьях, то тогда может и такое еще обдумаем...Всегда интересовал вопрос: выводить деревья в виде - родитель-его дети, родитель-его дети ну и т.д. Или я многого за раз хочу?


Хлам   (2003-09-03 11:34:00) [4]

Всем спасибо. Довел-таки до пристойного вида - выбираются только родители с количеством детишек (даже с нулевым)

select a.id, a.parentid, count(b.parentID) from tbl_name a left join tbl_name b on
a.ID = b.parentID group by a.id, a.parentid having a.parent=0

А все это производилось на сервере MySQL, причем довольно старой версии.


stone   (2003-09-03 11:25:00) [5]


> Danilka © (03.09.03 11:20) [12]


Давно не работал с Ораклом, но почему то мне кажется что и LEFT и RIGHT там все же есть


Danilka   (2003-09-03 11:24:00) [6]

Соловьев © (03.09.03 11:16)
работает для тех случаев, когда у дерева есть хотя-бы одна ветка.
если нет веток, то такие id не попадут в набор данных.
что, врочем, как-раз может и требоваться.


stone   (2003-09-03 11:24:00) [7]


> Danilka © (03.09.03 11:20) [12]


Поэтому я и спрашивал про СУБД. см. [4]


Danilka   (2003-09-03 11:20:00) [8]

stone © (03.09.03 10:45)
кстати, в орокле такой запрос не пашет, т.к. нет у него left join - а


bushmen   (2003-09-03 11:19:00) [9]

Соловьев © >
А он и не сказал, что запрос не работает: "Самый удачный получился у stone"


stone   (2003-09-03 11:17:00) [10]

HAVING count(b.ParentID) > 0


Соловьев   (2003-09-03 11:16:00) [11]


> Хлам (03.09.03 11:15) [8]

на чем ты експерементируешь?
у меня мой запрос он на 100 % корректно работает.


Хлам   (2003-09-03 11:15:00) [12]

Вот я поэксперементировал вашими запросиками, свои попробовал. Самый удачный получился у stone

select a.ID, count(b.ParentID) from Table1 a left join Table1.b on
a.ID = b.ParentID group by a.ID
На выходе вот так выглядит все
1-2
2-0
3-0
4-1
5-0
6-2
7-0
8-0

Вот только бы еще отсеять поля которые не являются родителями средствами sql. Можно как-нибудь включить агрегатное поле в условие поиска? Типа проверить, чтоб count(parentid) было больше нуля


Соловьев   (2003-09-03 10:50:00) [13]

select parent_id, count(id)
from tree
where parent_id<>0
group by parent_id


stone   (2003-09-03 10:48:00) [14]


> A_N_D © (03.09.03 10:40) [3]


В твоем случае в результат выборки попадут строки
0 3
а количество для ID = 2, 3, 5, 7 не покажется совсем


stone   (2003-09-03 10:45:00) [15]


> select a.ID, sum(b.ParentID) from Table1 a left join Table1.b
> on
> a.ID = b.ParentID group by a.ID


извиняюсь:
select a.ID, count(b.ParentID) from Table1 a left join Table1.b on
a.ID = b.ParentID group by a.ID


stone   (2003-09-03 10:43:00) [16]


> Хлам (03.09.03 10:37) [2]

1. Например в Oracle есть специальные команды для работы с деревьями.
2. Для одного уровня (независимо от субд) можно использовать запрос:

select a.ID, sum(b.ParentID) from Table1 a left join Table1.b on
a.ID = b.ParentID group by a.ID


A_N_D   (2003-09-03 10:40:00) [17]

select parentid, count(parentid) as cnt from table
where parentid>0
group by parentid
order by parentid


Хлам   (2003-09-03 10:37:00) [18]

1. А что нельзя стандартными средствами SQL, не зависимо от СУБД
2. Да хватит и одного...


stone   (2003-09-03 10:35:00) [19]

1. Не указана СУБД.
2. В этом дереве только 1 уровень вложенности или любое количество?


Наверх

Титульная страница Поиск, карта сайта Написать письмо