![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по 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 уровень вложенности или любое количество?