Запрос в MSSQL2000

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
snov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 28.11.2003 (Пт) 10:12
Откуда: Челябинск

Запрос в MSSQL2000

Сообщение snov » 11.03.2005 (Пт) 14:18

Нужно реализовать запросом или хранимкой, выборку из таблицы чтобы в результате были кортежи в порядке Родитель-Потомок.
Структура полей: ID(Primary Key), PARENT(ссылка на родителя), т.д.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 11.03.2005 (Пт) 14:21

скрипт таблиц и необходимы результат приведи, а то не понятно, что ты хочешь

snov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 28.11.2003 (Пт) 10:12
Откуда: Челябинск

Сообщение snov » 11.03.2005 (Пт) 14:31

Таблица AAA (Она одна)
Поле1:ID - Уникальный ключ
Поле2:PARENT - Ссылка на уникальный ключ
Поле3:DATA - Какие-то данные
....
По сути получается деревяная структура
Если у кортежа PARENT=0, то он является родителем без предков, если PARENT>0, то он является предком какого-либо кортежа из этой же самой таблицы. У одного кортежа может быть несколько потомков.Ну и так со всеми.
Трубуется получить: последовательность кортежей: Родитель-потомок. В итоге кортежи не будут отсортированы по ключу, но это и не нужно.
Иначально кортежи могут следовать в произвольном порядке

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 11.03.2005 (Пт) 15:39

ну и в чем проблема?


Код: Выделить всё
select * from AAA where Parent=1


например

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 11.03.2005 (Пт) 16:12

Может в записи нужно получить поле содержащее нечто вроде:

Группа0/Группа11/Группа111

Тогда просто пишется функция навроде этой:

Код: Выделить всё
CREATE  FUNCTION GetGroupsNames(@SubGroupID AS int)
RETURNS nvarchar(2000)
AS
   BEGIN
      DECLARE @s nvarchar(255), @ss nvarchar(2000)
      SET @ss = ''
      WHILE NOT @SubGroupID IS NULL
         BEGIN
            SELECT @SubGroupID=ParentID,
                  @s=Group
               FROM dbo.tblGroups
               WHERE ID_Group=@SubGroupID
            IF NOT @s IS NULL
               BEGIN
                  IF LEN(@ss)>0
                     SET @ss='/'+@ss
                  SET @ss=@s+@ss
               END
         END
      RETURN @ss
   END



И, когда надо, вызывается примерно так:

Код: Выделить всё
SELECT GetGroupsNames([GroupID], * FROM MyTable
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 11.03.2005 (Пт) 19:08

snov писал(а):... если PARENT>0, то он является предком какого-либо кортежа ...
Точно не потомком?

И еще, не совсем понятно, что именно тебе нужно. Входные условия какие?

snov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 28.11.2003 (Пт) 10:12
Откуда: Челябинск

Сообщение snov » 13.03.2005 (Вс) 9:27

Ennor писал(а):
snov писал(а):... если PARENT>0, то он является предком какого-либо кортежа ...
Точно не потомком?

И еще, не совсем понятно, что именно тебе нужно. Входные условия какие?
Ага потомком, очепатка ;)
2 Konst_One Выбрать нужно не только потомков, какого-либо предка, но и его самого. И такое по всем предкам
2 All Подробнее о проблеме
Таблица AAA
Код: Выделить всё
ID  | PARENT   | Какие-то данные
----------------------------------
1  |    0     |        xxx
2  |    0     |        xxx
3  |    1     |        xxx
4  |    0     |        xxx
5  |    3     |        xxx
6  |    1     |        xxx
8  |    1     |        xxx
9  |    2     |        xxx
10  |    5     |        xxx

В результате получаем
Код: Выделить всё
ID  | PARENT   | Какие-то данные
-------------------------------------
1  |    0     |        xxx
3  |    1     |        xxx
5  |    3     |        xxx
6  |    1     |        xxx
8  |    1     |        xxx
2  |    0     |        xxx
9  |    2     |        xxx
4  |    0     |        xxx
10  |    4     |        xxx

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 17.03.2005 (Чт) 11:49

snov писал(а):... Выбрать нужно не только потомков, какого-либо предка, но и его самого. И такое по всем предкам...
Я правильно понял, что тебе нужно одним запросом вернуть всю таблицу, просто неким хитрым образом отсортированную?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.03.2005 (Чт) 11:51

Ага.
И для этого нужно добавить хранимую процедуру, которая будет возвращать строку вида \id1\id2\id3; набор сортируешь по этой функции.
Иначе одним запросом никак.
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 17.03.2005 (Чт) 12:01

Знаешь, в такой хранимой процедуре тоже будет далеко не один запрос :).
Нет, совсем в один селект тут конечно никак не получится, но я как-то решал подобную задачу, и вот теперь безуспешно пытаюсь выяснить, на сколько же именно она подобна...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.03.2005 (Чт) 12:04

Ну понятно, что не один, но юзер то этого не знает :)
Но если заранее известна максимальная глубина вложенности (и она не слишком большая, 2-3 вложения), то можно обойтись и одним; в этом случае можно даже без хранимой процедуры обойтись.
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 17.03.2005 (Чт) 12:06

Можно, но тогда у тебя будет принципиальное ограничение на глубину вложенности, а это... ну, в общем, непорядочек :).

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.03.2005 (Чт) 12:07

Ennor писал(а):ну, в общем, непорядочек :).

А кому сейчас легко? Жизнь такая :)
Lasciate ogni speranza, voi ch'entrate.

snov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 28.11.2003 (Пт) 10:12
Откуда: Челябинск

Сообщение snov » 17.03.2005 (Чт) 13:21

2Ennor
Ennor писал(а):Я правильно понял, что тебе нужно одним запросом вернуть всю таблицу, просто неким хитрым образом отсортированную?
Именно!

2alibek
alibek писал(а):Ну понятно, что не один, но юзер то этого не знает :)
Но если заранее известна максимальная глубина вложенности (и она не слишком большая, 2-3 вложения), то можно обойтись и одним; в этом случае можно даже без хранимой процедуры обойтись.
Глубина может быть и больше(теоретически), практически вряд ли :)

2Оба Не хилая у вас дескуссия развернулась ... без меня :)

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: Запрос в MSSQL2000

Сообщение codemaster » 17.03.2005 (Чт) 13:21

snov писал(а):Нужно реализовать запросом или хранимкой, выборку из таблицы чтобы в результате были кортежи в порядке Родитель-Потомок.
Структура полей: ID(Primary Key), PARENT(ссылка на родителя), т.д.


прекрестный запрос ?
см. http://www.rsdn.ru/Forum/?mid=645878
//<-
Mit freundlichen Grüßen
//->

snov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 28.11.2003 (Пт) 10:12
Откуда: Челябинск

Re: Запрос в MSSQL2000

Сообщение snov » 17.03.2005 (Чт) 13:29

codemaster писал(а):прекрестный запрос ?
см. http://www.rsdn.ru/Forum/?mid=645878

Пасиба ща смотреть буду

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.03.2005 (Чт) 13:58

Записи в нужном порядке (если я его правильно понял) выдаст следующая процедура:

Код: Выделить всё
CREATE PROCEDURE spTest
AS
   DECLARE @t TABLE([ID] int, F smallint DEFAULT 2, S varchar(255))

   INSERT INTO @t ([ID], S) SELECT [ID], CAST([ID] AS varchar) FROM Test WHERE [Parent]=0
   WHILE @@ROWCOUNT >0
      BEGIN
         INSERT INTO @t ([ID], S) SELECT T.[ID], U.S + ',' + CAST(T.[ID] AS varchar)
            FROM Test T INNER JOIN @t U ON T.[Parent]=U.[ID]
            WHERE U.F=1
         UPDATE @t SET F=F-1 WHERE F>0
      END

   SELECT T.* FROM Test T INNER JOIN @t R ON T.[ID]=R.[ID] ORDER BY S


До 10-и уровней вложения. Нужно больше - можно легко доработать...

Правда непонятно для чего это нужно.
Может и не требуется огород гороить...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 2

    TopList  
cron