Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-82222
Armaniak
2003-09-12 09:00
2003.09.25
Не выделяется по умолчанию фокус на Итеме TRadioGroup


14-82454
KSergey
2003-09-05 15:34
2003.09.25
Конференция MS


1-82233
MAPIIIAJL
2003-09-05 09:37
2003.09.25
Как добраться программно к версии ПО


3-82035
bytebutcher
2003-09-03 12:17
2003.09.25
Помогите понять


4-82539
Mantic0re
2003-07-22 13:07
2003.09.25
Обработка фокуса ..





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский