Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.25;
Скачать: CL | DM;

Вниз

Вопрос по 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.028 c
14-82465
Dilezzz
2003-09-07 15:55
2003.09.25
Какой-то этот сайт непрофессиональный


1-82187
ddf
2003-09-12 19:46
2003.09.25
Компоненты для создания программ со скинами


4-82533
miwa
2003-07-25 11:56
2003.09.25
Как можно (если можно) использовать вывод функции Win32Check


1-82191
Юлия
2003-09-12 18:58
2003.09.25
создание массива


3-82128
Layner
2003-09-04 13:06
2003.09.25
В FastReport (в любом) отражаю числовое поле из БД, как это поле