2016-01-13 2 views
0

Итак, у меня есть таблица, подобная этой здесь http://sqlfiddle.com/#!9/ea557/1 Это небольшая часть более крупного комплекса sql. Мой желаемый должен быть чем-то вродеmssql parent child lookup sql

ParentId | TopChildId | AllChild  | Priority 
-------------------------------------------- 
    10  | 541  | 345, 541  | 2 
    12  | 125  | 123, 124,125 | 3 
    13  | 103  | 103, 104  | 2 
    14  | 161  | 161   | 1 

Надеюсь, это имеет смысл. Таким образом, в одной строке я хочу увидеть parentID, ID ребенка с наибольшим номером приоритета и в столбце, перечислить все дочерние id конкатенированные.

Оцените справку.

+0

Fiddle в MySql ... вопрос указывает, что это SQL-сервер ... – xQbert

+0

извините, Didn Не обращай внимания на это. Изменил его на MSSql – Eclipse

ответ

0

Чтобы получить CID с помощью Top priority, вы можете использовать ROW_NUMBER. Чтобы получить сцепленные CID сек каждого PID, вы можете использовать FOR XML PATH:

SQL Fiddle

WITH Cte AS(
    SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY PID ORDER BY priority DESC) 
    FROM ParChi 
) 
SELECT 
    ParentID = c.PID, 
    TopChildId = c.CID, 
    x.AllChild, 
    c.priority 
FROM Cte c 
CROSS APPLY(
    SELECT STUFF((
     SELECT ', ' + CONVERT(VARCHAR(10), CID) 
     FROM ParChi 
     WHERE PID = c.PID 
     ORDER BY priority 
     FOR XML PATH('') 
    ),1, 2, '') AS AllChild 
) x 
WHERE rn = 1 
ORDER BY ParentID 
+0

Спасибо Феликс. Это работало как шарм. – Eclipse

+0

Итак, я только что узнал о другой таблице, где мне нужно собрать еще несколько данных и выглядит так, что у этой таблицы уже есть иерархия. Я перестроил таблицу в sqlfiddle http://sqlfiddle.com/#!6/7092e/1, новая таблица AllProd2 является близким представлением моих данных. Итак, если бы я должен был сделать то же самое на этой таблице и получить строку с максимальным приоритетом при отображении других дочерних идентификаторов? – Eclipse

+0

, поэтому у меня что-то странное происходит. Это отлично работает в таблицах, которые у меня есть в sqlfiddle, но когда я пытаюсь использовать тот же код для моих фактических таблиц, AllChild только подтягивает верхнего ребенка! Есть идеи? – Eclipse

0
SELECT p.PID AS ParentId , MAX(p.CID) AS TopChildId, temp.AllChild, MAX(p.priority) 
FROM ParChi p 
OUTER APPLY 
(
    SELECT 
    STUFF((SELECT ', ' + pc.CID 
    FROM ParChi pc   
    WHERE pc.PID = p.PID 
    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 0, '') AS AllChild 
)AS temp 
GROUP BY p.PID ORDER BY p.PID 
+0

Спасибо Маюри. Этот sql продолжает выходить из строя для меня, однако ответ Felix опубликовал работу. Большое спасибо за Вашу помощь. – Eclipse