Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2010, 19:18   #1
-MagicAlex-
Пользователь
 
Аватар для -MagicAlex-
 
Регистрация: 28.12.2009
Сообщений: 42
По умолчанию SQL-запрос

Есть таблица subdivision, в которой хранятся данные о иерархии подразделений:
subid | sub_name | parentid
subid - идентификатор подразделения, первичный ключ
parentid - id родительского подразделения

Нужен запрос, в котором будет 3 столбца - id подразделения, название подразделения, количество дочерних подразделений у подразделения.

Код:
SELECT subid, sub_name, (SELECT count(*) FROM subdivision WHERE parent_id = XXXXX) AS child 
FROM subdivision WHERE parent_id = :p1
Полдня бьюсь, голову сломал уже... Какое условие писать в запросе где count? Как на место XXXXX поставить значение, получаемое в первом поле основного запроса?
-MagicAlex- вне форума Ответить с цитированием
Старый 02.09.2010, 19:40   #2
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

попробуй так:
Код:
SELECT s.subid, s.sub_name, (SELECT count(*) FROM subdivision s1 WHERE s1.parent_id = s.subid) AS child 
FROM subdivision s WHERE s.parent_id = :p1
P.S. и вообще, если я верно понял смысл твоих условий, то вполне логично было бы сделать так:
Код:
SELECT subid, sub_name, (SELECT count(*) FROM subdivision WHERE parent_id = :p1) AS child 
FROM subdivision WHERE parent_id = :p1
в результате у тебя получится всего одна строчка с указаным parent_id.
так как условия у тебя идентичны (или я чего то не понял)
а вот если тебе нужно вывести все записи с подсчетом дочерних, то бери первый запрос только убери последнее условие (WHERE s.parent_id = : p1)
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 02.09.2010 в 19:55.
Yurk@ вне форума Ответить с цитированием
Старый 02.09.2010, 21:08   #3
-MagicAlex-
Пользователь
 
Аватар для -MagicAlex-
 
Регистрация: 28.12.2009
Сообщений: 42
По умолчанию

Да, нужно было вывести все записи с подсчетом дочерних, первый вариант запроса подошел
Спасибо огромное!

И еще вот какой вопрос возник. Имея идентификатор подразделения, нужно получить идентификаторы всех его потомков (именно потомков, а не детей). Учитывая то, что уровень иерархии заведомо неизвестен, то видимо нужна рекурсия...
Осуществимо ли это вообще средствами SQL?

Последний раз редактировалось Stilet; 03.09.2010 в 09:38.
-MagicAlex- вне форума Ответить с цитированием
Старый 03.09.2010, 09:22   #4
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

в таких случаях я обходился вводом доп. поля с признаком типа потомка.
т.е. в моем случае родитель был "год операции" с признаком "0"
соответственно:
месяц - "1"
день - "2"
часы - "3"
и уже на основании этих признаков я строил свое дерево
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос с CASE переделать в запрос с PIVOT (MS SQL Server 2005) Машуля SQL, базы данных 4 06.05.2010 21:09
SQL запрос Yur@ SQL, базы данных 1 28.01.2010 19:48
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 18:15