У меня есть иерархические данные, хранящиеся в моей таблице [AdjT] в SQL Server 2014. Общая глубина данных составляет 4 уровня и фиксирована.
т.е. [Родитель - Child1 - Child2 - Child3]Как использовать данные одного столбца для получения данных для другого столбца в инструкции SQL SELECT
Столбцы: Adjt {Id, ParentId, название, TypeM}
Вы можете увидеть данные в изображении.
несколько иерархий (как в TypeM) присутствуют в одной таблице (вы можете увидеть 2 родителей)
Что мне требуется?
Мне нужно получить все родительские «Название» для любого данного Ребенка.
например, ниже изображение показывает «иерархия» для Id: 4 для TypeM: AAA
То, что я сделал до сих пор
Этот запрос дает мне ребенка строку и его непосредственного родителя.
select a.Title as P1, (select a1.Title from AdjT as a1 where a1.Id=a.ParentId) as P1 from Adjt as a where a.TypeM='AAA' and a.Id=4;
так:
Вопрос:
Но когда я пытаюсь получить доступ к P3 на основе ParentID P2, я получаю сообщение об ошибке.
[Идентификатор нескольких частей "a1.ParentId" не может быть связан.]
в соответствии с приведенной ниже запроса:
select a.Title as P1 , (select a1.Title from AdjT as a1 where a1.Id=a.ParentId) as P2 , (select a2.Title from AdjT as a2 where a2.Id=a1.ParentId) as P3 --"a1.ParentId" ERROR from Adjt as a where a.TypeM='AAA' and a.Id=4;
Даже если я пишу, как P2.ParentId , это дает мне:
Идентификатор из нескольких частей "P2.ParentId" не может быть связан.
Что я могу сделать для того, чтобы это работало?
Обходной, который я использую в настоящее время
Я использую вложенный запрос, чтобы получить доступ к данным и иерархии, которые мне нужны.
Его выполнение по нижеследующему запросу:
select a.Title as P1 , (select a1.Title from AdjT as a1 where a1.Id=a.ParentId) as P2 , (select a2.Title from AdjT as a2 where a2.Id=(select a1.ParentId from AdjT as a1 where a1.Id=a.ParentId)) as P3 , (select a3.Title from AdjT as a3 where a3.Id=(select a2.ParentId from AdjT as a2 where a2.Id=(select a1.ParentId from AdjT as a1 where a1.Id=a.ParentId))) as P4 from Adjt as a where a.TypeM='AAA' and a.Id=4;
Есть ли лучший способ сделать это? Почему я могу получить доступ только к родительскому родительскому элементу первого столбца?
Я не могу редактировать схему таблицы или как хранить данные. Иерархия должна извлекаться снизу вверх, используя идентификатор листового узла, как показано выше.
Я попытался использовать CTE для получения иерархических данных, но я хочу, чтобы они были «столбцами», а не «строками». Преобразование этих строк CTE в столбцы в «коде» также не является вариантом.
Если кто-нибудь может предложить лучший способ сделать это, это было бы очень полезно.
Спасибо, что прочитали мой вопрос, любая помощь будет оценена по достоинству.
Мой совет: внимательно посмотрите на ответ Рахула и убедитесь, что вы полностью понимаете, как работает «JOIN». Они являются неоценимой частью SQL. Многие подзапросы, которые вы используете, приведут к очень неаккуратным и трудно читаемым (и поддерживающим) кодам, которые, вероятно, будут работать очень плохо. Если вы собираетесь делать больше SQL-программирования в будущем, вы должны прочитать некоторые вступительные книги по этой теме. –
Считаете ли вы использование [Иерархических данных] (https://msdn.microsoft.com/en-us/library/bb677173.aspx)? – shadow