2017-01-05 11 views
1

Так я боролся с этим в течение последнего часа, так что теперьSQL Server - получить родительские значения от ребенка рекурсивно

Я пишу сценарий для извлечения некоторых данных в хорошем формате для меня использовать в другой процесс, но я не могу понять этот конкретный бит (я не использую SQL Server много)

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

tblCategories

cat_id cat_name 
1  Trousers 
2  Tracksuits 
3  Woolen 

tblCategoryHierarchy

ch_parentid ch_childid 
0   1 
1   2 
2   3 

Я также получил мой стол продукта, который имеет cat_id в его

tblProduct

p_id p_name  p_cat_id 
1  Red Trouser 3 

Итак, я хочу отобразить идентификатор продукта, имя и иерархию всех категорий, связанных с тем, что находится в tblProduct.

Так для этого примера, он будет отображать:

id name   cats 
1 Red Trouser Trousers > Tracksuits > Woolen 

Надеюсь кто-нибудь может дать мне руку здесь! Благодаря

+5

Термин, который вы ищете, является «рекурсивным cte». На этот вопрос ответили сотни раз на SO и всюду в Интернете. Затем, чтобы получить список категорий в одном столбце, вам нужно будет использовать STUFF и FOR XML –

+0

https://stackoverflow.com/questions/tagged/sql-server+recursive-query –

ответ

2

Попробуйте это:

;WITH CTE AS (
    SELECT p.p_id AS id, p.p_cat_id, 1 AS level, 
      p.p_name, CAST(c.cat_name AS VARCHAR(200)) AS cat 
    FROM tblProduct AS p 
    JOIN tblCategories AS c ON p.p_cat_id = c.cat_id 

    UNION ALL 

    SELECT c.id, ch.ch_parentid AS cat_id, level = c.level + 1, 
      c.p_name, CAST(c2.cat_name AS VARCHAR(200)) AS cat 
    FROM tblCategoryHierarchy AS ch 
    JOIN CTE AS c ON ch.ch_childid = c.p_cat_id 
    JOIN tblCategories AS c2 ON ch.ch_parentid = c2.cat_id 
) 
SELECT id, p_name, 
     STUFF(REPLACE((SELECT CONCAT('>', cat) 
         FROM CTE 
         ORDER BY level DESC 
         FOR XML PATH('')), '>', '>'), 1, 1, '') AS cat 
FROM CTE 

рекурсивная часть запроса возвращает все категории от ребенка в возрасте до родительского уровня. В запросе используется FOR XML PATH, чтобы объединить имена категорий в порядке обратного уровня (т. Е. От родителя к дочернему).

REPLACE используется потому, что символ '>' показан как 'gt;' от FOR XML PATH.

+0

Это сработало очень хорошо! Мне пришлось немного изменить его, а затем, как оказалось, данные, которые я использую, имеют категории, которые указывают на детей из себя, поэтому он застревает в цикле ... О, хорошо! Спасибо за код! Принятый ответ – vxstorm

 Смежные вопросы

  • Нет связанных вопросов^_^