Помощь с запросом t-sql

75
8

В соответствии со следующей таблицей


Path
----------------------
area1
area1\area2
area1\area2\area3
area1\area2\area3\area4
area1\area2\area5
area1\area2\area6
area1\area7

Ввод моей хранимой процедуры - isapath и no.of children (указывает глубину, которая должна учитываться при вводе isapath)


AreaPath = Area1

дети = 2


Выше должно быть указано


Path
-----------
area1
area1\area2
area1\area2\area3
area1\area2\area5
area1\area2\area6
area1\area7

аналогичный для

areapath = area2 и дети = 1 вывод должен быть


Path
---------------
area1\area2
area1\area2\area3
area1\area2\area5
area1\area2\area6

Я смущен, как написать запрос для этого.

спросил(а) 2010-04-28T00:28:00+04:00 10 лет, 11 месяцев назад
1
Решение
61

Хм... Похоже, это та часть, где вы научитесь нормализовать свои данные. Было бы тривиально, если бы вы просто хранили свое дерево как дерево.


При этом вы, вероятно, можете снять это с помощью какого-либо фантастического разделения строк и разбора.

Вам понадобится UDF, который разбивает строку, содержащую косые черты, в массив токенов. TSQL не имеет встроенной функции для этого или концепции массивов, поэтому вам нужно немного похудеть и использовать временные таблицы.


Тогда это просто вопрос сравнения записи [children] th в этом массиве с предоставленным [isapath] в вашем предложении WHERE.

ответил(а) 2010-04-28T00:40:00+04:00 10 лет, 11 месяцев назад
44

Думаю, это не домашнее задание.


create table #Tt([path] varchar(255))
insert #tt values( 'area1')
insert #tt values( 'area1\area2')
insert #tt values( 'area1\area2\area3')
insert #tt values( 'area1\area2\area3\area4')
insert #tt values( 'area1\area2\area5')
insert #tt values( 'area1\area2\area6')
insert #tt values( 'area1\area7')

select * from #tt where len([path])-len(replace([path],'\','')) = 2 and [path] like 'area1\%'

drop table #tt

ответил(а) 2010-04-28T02:20:00+04:00 10 лет, 11 месяцев назад
44

Я согласен с Джейсоном, но помните, что вы можете использовать VB.NET/C# для записи функции расщепления, а затем привести ее в SQL Server с помощью возможности импорта CLR. Это, конечно, предполагает, что для этого у вас есть соответствующие полномочия на сервере. Но в то время как SQL замечателен для многих вещей, у него нет таких надежных инструментов обработки строк, как это делают другие языки.

ответил(а) 2010-04-28T01:09:00+04:00 10 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема