Помогите с запросом t-sql - PullRequest
0 голосов
/ 28 апреля 2010

На основании следующей таблицы

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

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

AreaPath = area1
дети = 2

выше должно дать

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

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

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

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

Ответы [ 3 ]

1 голос
/ 28 апреля 2010

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

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

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

Тогда нужно просто сравнить [дочернюю] запись в этом массиве с предоставленным [areapath] в предложении WHERE.

0 голосов
/ 28 апреля 2010

Я думаю, это не домашняя работа.

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
0 голосов
/ 28 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...