Выберите детей такими, какие они есть.
Для родителей используйте подзапрос в FROM
, чтобы получить набор различных Parent_ID
s.При условии, что есть только два дочерних элемента, вы можете использовать другие подзапросы, выбрав min(Child_ID)
или max(Child_ID)
соответственно в списке столбцов.
UNION ALL
оба результата.
Поместить внешний запроспо результату UNION ALL
и закажите его по coalesce(Parent_ID, ID), CASE WHEN ID IS NULL THEN 1 ELSE 0 END, ID
, чтобы достичь того порядка, который вы хотите.CASE
- это хак для обеспечения того, чтобы ID
был NULL
последним.(Я не уверен, что NULLS
стоит первым или последним в SQL Server и слишком ленив, чтобы искать его прямо сейчас. Или, если я правильно помню, есть опция для всей базы данных?самая безопасная ставка.)
SELECT *
FROM (SELECT Child_ID ID,
Parent_ID,
NULL Child_1,
NULL Child_2,
Identifier
FROM sampletable
UNION ALL
SELECT x.Parent_ID ID,
NULL Parent_ID,
(SELECT min(Child_ID)
FROM sampletable y
WHERE y.Parent_ID = y.Parent_ID) Child_1,
(SELECT max(Child_ID)
FROM sampletable y
WHERE y.Parent_ID = y.Parent_ID) Child_2,
'IN' Identifier
FROM (SELECT DISTINCT Parent_ID
FROM sampletable) x) u
ORDER BY coalesce(Parent_ID,
ID),
CASE
WHEN ID IS NULL
THEN 1
ELSE
0
END,
ID;
SQL Fiddle