В настоящее время я пишу SQL-запрос, который должен отображать древовидное представление областей внутри здания с областями, подзонами и т. Д. К сожалению, мне не удалось имитировать порядок, используемый некоторыми нашими программными инструментами. Я ограничен MS SQL 2000, поэтому вопрос о заказе становится намного сложнее, и я сейчас нахожусь над моей головой.Более продвинутая логика для упорядочивания результатов запроса в T-SQL?
Логика заказа заключается в том, что столбец «Дети» и «Родительский столбец» взаимосвязаны. Если значение столбца «Дети» 1-й строки соответствует столбцу «Родитель» второй строки, вторая строка идет после первого.
--How it currently returns data
Child Level Parent
562 Campus 0
86 Area 1
87 Area 1
88 Area 1
90 Sub-Area 86
91 Sub-Area 86
92 Sub-Area 87
93 Sub-Area 87
94 Sub-Area 88
95 Sub-Area 88
3 Unit 90
16 Unit 90
4 Unit 91
6 Unit 91
etc, so on and therefore
--How I want it to return the data
Child Level Parent
562 Campus 0
1 Building 562
86 Area 1
90 Sub-Area 86
91 Sub-Area 86
87 Area 1
95 Sub-Area 87
95 Sub-Area 87
Для этого логика для корректной работы ему необходимо будет сделать что-то вроде
- Вернуться строительные строки с их родителем и ребенком кодов
- Match Area коды Родитель к кодам здания ребенка, то вставьте строки строк под соответствующей строкой Строка.
- Подходящие подгруппы Подходящие коды родительских кодов для детей, а затем вставьте строки подрайона под соответствующей областью.
- Match Unit Родительские коды к подзоне кодов ребенка, а затем вставьте строки Unit в соответствующей подобласти
Если это действительно возможно с SQL?
Я хотел бы знать, если это так, поскольку я не решаюсь вкладывать в это больше времени, если не знаю, что это на самом деле возможность. Я понимаю, что я могу написать оператор CASE с настраиваемым сопоставлением для инструкции ORDER BY, но это не сработает ни для какого другого кампуса (родительские/дочерние коды разные), и я хотел бы иметь возможность повторно использовать этот код в будущем с минимальной настройкой.
Спасибо!
EDIT: Добавление запроса в соответствии с просьбой
DECLARE
@BuildingType int,
@CampusType int
SET @BuildingType= 4
SET @CampusType= 1
select
b.fkabc_building_child,
(select isnull(c.collectionname, 'none')
from abc_collections c
where c.pkabc_collections = b.fkabc_building_child) as 'Child Collection',
l.floorname,
isnull(b.fkabc_collections_parent,0) as fkabc_collections_parent,
b.fkabc_floorbreakdowns
from abc_breakdowns r
left join abc_floorbreakdowns fr
on fr.pkabc_floorbreakdowns = b.fkabc_floorbreakdowns
inner join abc_buildingtypescampustypes btct
on btct.pkabc_buildingtypescampustypes = fr.fkabc_buildingtypescampustypes
inner join abc_buildingtypes bt
on btct.fkabc_buildingtypes = bt.pkabc_buildingtypes
inner join abc_collectiontypes ct
on btct.fkabc_collectiontypes = ct.pkabc_collectiontypes
inner join abc_collections c
on b.fkabc_building_child = c.pkabc_collections
inner join abc_floors l
on l.pkabc_floors = c.fkabc_floors
where bt.pkabc_buildingtypes = @BuildingType
and ct.pkabc_collectiontypes = @CampusType
Можете ли вы опубликовать запрос, который вы используете сейчас. Это может помочь нам, если мы понимаем схему, с которой вы работаете. –
Ооо, это сложно. Это займет промежуточную таблицу, итерацию и некоторую фидшую логику. Я бы сработал для вас, но сейчас не время. Удачи! –
Является ли иерархия произвольно глубокой или ограничена 5 уровнями? Если он ограничен 5 уровнями, то это может быть сделано в режиме «в линию», «нет» или «промежуточная таблица». –