Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Трудности с составлением запроса 
V
    Опции темы
sani79
Дата 2.3.2007, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 14.12.2005

Репутация: нет
Всего: нет



Ребята помогите пожалуйста составить запрос. Проблема такая: есть таблица с подразделениями компании - DivName (имя подразделения), ParentID (ID подразделения), DivisionID (ID подразделения). Вершина таблицы, запись "Все" имеет ParentID=Null. Необходимо сделать запрос, результатом которого появилось бы новое поле, в котором отображалась глубина подразделения, то есть "Все" - 1, ниже уровнем -2 и.т.д. Заранее спасибо!
PM MAIL   Вверх
Rodman
Дата 2.3.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 1
Всего: 122



Код

ALTER TABLE Divs ADD COLUMN AllInc INTEGER; 


a вот с расчетом вложености не уверен, мож просто расчитывать в ручную и добавлять...
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Paradox
Дата 2.3.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



если 2000 сервак то без хранимой функции не обойдетесь
а если 2005 то читайте и разбирайтесь сюда: http://msdn2.microsoft.com/ru-ru/library/ms175972.aspx
в 2005 можно и без функции smile


--------------------
---
PM MAIL WWW   Вверх
sani79
Дата 2.3.2007, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 14.12.2005

Репутация: нет
Всего: нет



Rodman, хммм.. вручную это как? 

Paradox, спасибо, но сервак 2000.... хотелось бы конечно обойтись без хранимой процедуры... может как то через вложенные запросы?
PM MAIL   Вверх
Paradox
Дата 3.3.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



неа
не получится через вложенные запросы рекурсию сделать smile


--------------------
---
PM MAIL WWW   Вверх
SergKO
Дата 5.3.2007, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 14.3.2005

Репутация: 17
Всего: 20



Попробуйте следующий код

Код

declare @dt_Company table (DivName varchar(50), ParentId int, DivisionId int);
    -- Заполнение таблицы тестовыми данными
    insert into @dt_Company
        select 'Все', null, 1
        union all
        select 'П1', 1, 2
        union all
        select 'П2', 1, 3
        union all
        select 'П3', 2, 4
        union all
        select 'П4', 2, 5
        union all
        select 'П5', 3, 6
        union all
        select 'П6', 4, 7

-- Поле Depth - уровень вложенности
declare @dt_CompanyDepth table (DivName varchar(50), ParentId int, DivisionId int, Depth int);

declare    @row    int,
    @count    int;

    -- Выборка самого верхнего уровня 'Все'
    insert into @dt_CompanyDepth
        select DivName, ParentId, DivisionId, 1 from @dt_Company where ParentId is null;

    select @row = @@ROWCOUNT, @count = 1;

    while @row > 0
    begin

        -- По одному уровню вниз

        insert into @dt_CompanyDepth
            select c.DivName, c.ParentId, c.DivisionId, cd.Depth+1 as Depth
            from @dt_CompanyDepth cd
                inner join @dt_Company c on c.ParentId = cd.DivisionId
            where cd.Depth > @count - 1;

        select @row = @@ROWCOUNT, @count = @count + 1;
    end

    -- Цикл завершается когда @row = 0


select * from @dt_CompanyDepth;




Это сообщение отредактировал(а) SergKO - 5.3.2007, 06:50
PM MAIL   Вверх
sani79
Дата 6.3.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 14.12.2005

Репутация: нет
Всего: нет



SergKO, Большое спасибо. Навсидку то что нужно. Сейчас потестирую на реальной таблице. О результатах напишу.
PM MAIL   Вверх
sani79
Дата 6.3.2007, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 14.12.2005

Репутация: нет
Всего: нет



SergKO, Еще раз спасибо, это действительно то что нужно!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.1169 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.