Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

Открыть новую тему     Написать ответ в эту тему

DenSyo

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NeoAnomaly
следующая конструкция должна бы вам подойти, но присоединюсь к вопросу выше...

Код:
SELECT [t1].* FROM mytab [t1]  
INNER JOIN ( SELECT MAX([id]) AS [max_id], [ParentId], [Level] FROM mytab GROUP BY [ParentId], [Level] ) [t2] ON [t2].[max_id]=[t1].[id]


Всего записей: 138 | Зарегистр. 19-01-2008 | Отправлено: 07:39 13-12-2018 | Исправлено: DenSyo, 07:49 13-12-2018
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuriyRR, здесь уровень - это просто значение из предметной области - уровень в корпоративной иерархии.
 
Пока гуглил наткнулся на точно такую же структуру данных. В БД ФИАС данные организованы похожим образом, поэтому можно задачу переписать с использованием хорошо известной нам всем предметной области:
 

Код:
 
Id     ParentId           Level        Field  
----------------------------------------------  
1        null             Область      Амурская  
2        1                Район        Архаринский  
3        1                Район        Белогорский  
4        1                Район        Зейский  
5        2                Город        Белогорск  
6        2                Город        Благовещенск  
7        3                Город        Свободный
8        7                Улица        Ленина
9        6                Улица        Ленина
 

 
И вот нужна мне именно улица Ленина, но только в Городе Благовещенск из Района Белогорский. И в результате запроса я должен собрать весь путь, т.е. Амурская -> Белогорский -> Благовещенск -> Ленина:
 

Код:
 
Id     ParentId           Level        Field  
----------------------------------------------  
1        null             Область      Амурская  
3        1                Район        Белогорский  
6        2                Город        Благовещенск  
9        6                Улица        Ленина
 

 
Т.е. в процессе поиска улицы на уровнях Район и Город я должен проверить, что значение [Field] равно Белогорский и Благовещенск соответственно.
 
DenSyo, скорее из-за неправильной постановки задачи, немного не то получается.

Всего записей: 416 | Зарегистр. 23-03-2010 | Отправлено: 08:45 13-12-2018
DenSyo

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
т.е. Амурская -> Белогорский -> Благовещенск -> Ленина

может все же Амурская - Архаринский - Благовещенск - Ленина ?  
либо Амурская - Белогорский - Свободный - Ленина...
 
вложенность селектов в конструкции надо сделать по максимальному числу наследования в таблице, либо с запасом

Код:
SELECT [tt].*, IIF([tt].[ParentId] IS NOT NULL, ( SELECT [t1].[Field]
  +IIF([t1].[ParentId] IS NOT NULL, ' - '+( SELECT [t2].[Field]  
  +IIF([t2].[ParentId] IS NOT NULL, ' - '+( SELECT [t3].[Field]  
  +IIF([t3].[ParentId] IS NOT NULL, ' - '+( SELECT [t4].[Field]  
  +IIF([t4].[ParentId] IS NOT NULL, ' - '+( SELECT [t5].[Field]  
  FROM heap.dbo.tree [t5] WHERE [t5].[Id]=[t4].[ParentId] ), '')  
  FROM heap.dbo.tree [t4] WHERE [t4].[Id]=[t3].[ParentId] ), '')  
  FROM heap.dbo.tree [t3] WHERE [t3].[Id]=[t2].[ParentId] ), '')  
  FROM heap.dbo.tree [t2] WHERE [t2].[Id]=[t1].[ParentId] ), '')  
  FROM heap.dbo.tree [t1] WHERE [t1].[Id]=[tt].[ParentId] ), NULL) AS [FieldsParents]  
FROM heap.dbo.tree [tt]  

Всего записей: 138 | Зарегистр. 19-01-2008 | Отправлено: 10:00 13-12-2018 | Исправлено: DenSyo, 11:07 13-12-2018
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
может все же Амурская - Архаринский - Благовещенск - Ленина ?  

DenSyo, да, вы правы. За запрос спасибо, буду разбираться.

Всего записей: 416 | Зарегистр. 23-03-2010 | Отправлено: 11:38 13-12-2018
DenSyo

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NeoAnomaly
конструкция с джойнами позволит без потери производительности собрать несколько полей из предков

Код:
SELECT [tt].*, IIF([t1].[Id] IS NULL, NULL, [t1].[Field]+' '+[t1].[Level]  
    +IIF([t2].[Id] IS NULL, '', ' - '+[t2].[Field]+' '+[t2].[Level]  
    +IIF([t3].[Id] IS NULL, '', ' - '+[t3].[Field]+' '+[t3].[Level]  
    +IIF([t4].[Id] IS NULL, '', ' - '+[t4].[Field]+' '+[t4].[Level]  
    +IIF([t5].[Id] IS NULL, '', ' - '+[t5].[Field]+' '+[t5].[Level]
  ))))) AS [FParents],  
  IIF([t1].[Id] IS NULL, NULL, CAST([t1].[Id] AS VARCHAR)  
    +IIF([t2].[Id] IS NULL, '', ';'+CAST([t2].[Id] AS VARCHAR)  
    +IIF([t3].[Id] IS NULL, '', ';'+CAST([t3].[Id] AS VARCHAR)  
    +IIF([t4].[Id] IS NULL, '', ';'+CAST([t4].[Id] AS VARCHAR)  
    +IIF([t5].[Id] IS NULL, '', ';'+CAST([t5].[Id] AS VARCHAR)
  ))))) AS [IdsParents],  
  IIF([t1].[Id] IS NULL, 0, 1  
    +IIF([t2].[Id] IS NULL, 0, 1  
    +IIF([t3].[Id] IS NULL, 0, 1  
    +IIF([t4].[Id] IS NULL, 0, 1  
    +IIF([t5].[Id] IS NULL, 0, 1
  ))))) AS [CountParents]  
FROM heap.dbo.tree [tt]  
LEFT MERGE JOIN heap.dbo.tree [t1] ON [tt].[ParentId] IS NOT NULL AND [t1].[Id]=[tt].[ParentId]  
LEFT MERGE JOIN heap.dbo.tree [t2] ON [t1].[ParentId] IS NOT NULL AND [t2].[Id]=[t1].[ParentId]  
LEFT MERGE JOIN heap.dbo.tree [t3] ON [t2].[ParentId] IS NOT NULL AND [t3].[Id]=[t2].[ParentId]  
LEFT MERGE JOIN heap.dbo.tree [t4] ON [t3].[ParentId] IS NOT NULL AND [t4].[Id]=[t3].[ParentId]  
LEFT MERGE JOIN heap.dbo.tree [t5] ON [t4].[ParentId] IS NOT NULL AND [t5].[Id]=[t4].[ParentId]  

Всего записей: 138 | Зарегистр. 19-01-2008 | Отправлено: 05:11 14-12-2018 | Исправлено: DenSyo, 06:09 14-12-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Имя:
Пароль:
Сообщение

Для вставки имени, кликните на нем.

Опции сообщенияДобавить свою подпись
Подписаться на получение ответов по e-mail
Добавить тему в личные закладки
Разрешить смайлики?
Запретить коды


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2018

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru

Рейтинг.ru