Форум: "Базы";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];
ВнизВопрос по SQL...Скорей всего простейший Найти похожие ветки
← →
Хлам (2003-09-03 10:31) [0]Здравствуйте, уважаемые...Поговорим опять о деревьях. Вот есть такое:
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 сына) и т.п. конечно в результат включать не надо, это я так, для наглядности
← →
stone (2003-09-03 10:35) [1]1. Не указана СУБД.
2. В этом дереве только 1 уровень вложенности или любое количество?
← →
Хлам (2003-09-03 10:37) [2]1. А что нельзя стандартными средствами SQL, не зависимо от СУБД
2. Да хватит и одного...
← →
A_N_D (2003-09-03 10:40) [3]select parentid, count(parentid) as cnt from table
where parentid>0
group by parentid
order by parentid
← →
stone (2003-09-03 10:43) [4]
> Хлам (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
← →
stone (2003-09-03 10:45) [5]
> 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:48) [6]
> A_N_D © (03.09.03 10:40) [3]
В твоем случае в результат выборки попадут строки
0 3
а количество для ID = 2, 3, 5, 7 не покажется совсем
← →
Соловьев (2003-09-03 10:50) [7]select parent_id, count(id)
from tree
where parent_id<>0
group by parent_id
← →
Хлам (2003-09-03 11:15) [8]Вот я поэксперементировал вашими запросиками, свои попробовал. Самый удачный получился у 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 11:16) [9]
> Хлам (03.09.03 11:15) [8]
на чем ты експерементируешь?
у меня мой запрос он на 100 % корректно работает.
← →
stone (2003-09-03 11:17) [10]HAVING count(b.ParentID) > 0
← →
bushmen (2003-09-03 11:19) [11]Соловьев © >
А он и не сказал, что запрос не работает: "Самый удачный получился у stone"
← →
Danilka (2003-09-03 11:20) [12]stone © (03.09.03 10:45)
кстати, в орокле такой запрос не пашет, т.к. нет у него left join - а
← →
stone (2003-09-03 11:24) [13]
> Danilka © (03.09.03 11:20) [12]
Поэтому я и спрашивал про СУБД. см. [4]
← →
Danilka (2003-09-03 11:24) [14]Соловьев © (03.09.03 11:16)
работает для тех случаев, когда у дерева есть хотя-бы одна ветка.
если нет веток, то такие id не попадут в набор данных.
что, врочем, как-раз может и требоваться.
← →
stone (2003-09-03 11:25) [15]
> Danilka © (03.09.03 11:20) [12]
Давно не работал с Ораклом, но почему то мне кажется что и LEFT и RIGHT там все же есть
← →
Хлам (2003-09-03 11:34) [16]Всем спасибо. Довел-таки до пристойного вида - выбираются только родители с количеством детишек (даже с нулевым)
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, причем довольно старой версии.
← →
Хлам (2003-09-03 11:38) [17]А вот что...Раз уж заговорили о деревьях, то тогда может и такое еще обдумаем...Всегда интересовал вопрос: выводить деревья в виде - родитель-его дети, родитель-его дети ну и т.д. Или я многого за раз хочу?
← →
stone (2003-09-03 11:42) [18]Хлам (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
← →
Danilka (2003-09-03 11:42) [19]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, точнее, чем они отличаются. :))
Вот, сейчас заказываю книжку "Мир Интербазе", раз начал с ним работать, может там чего написано будет. :))
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c