T-SQL: как вернуть родительские и дочерние записи в определенном формате? - PullRequest
1 голос
/ 19 июля 2011

Можно ли с помощью T-SQL написать запрос, который возвращает результаты, которые выглядят следующим образом?

Parent A        
   ChildOfParentA_1 ChildField1 ChildField2
   ChildOfParentA_2 ChildField1 ChildField2
   ChildOfParentA_3 ChildField1 ChildField2
Parent B        
   ChildOfParentB_1 ChildField1 ChildField2
   ChildOfParentB_2 ChildField1 ChildField2
   ChildOfParentB_3 ChildField1 ChildField2

В этих результатах есть строка, содержащая только одно поле для каждой родительской записи,с дополнительными полями, установленными в NULL.Затем, под родительской записью, есть строка для дочерних записей, которая имеет три поля.

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

Ответы [ 3 ]

2 голосов
/ 19 июля 2011

Я предполагаю, что ваши родительские и дочерние записи находятся в разных таблицах и могут быть объединены ParentID, который находится в обеих таблицах. Следующий запрос выбирает записи из обеих таблиц, форматирует их так, чтобы они имели одинаковое количество столбцов, объединял их вместе и выводил их с небольшим форматированием.

SELECT ParentName, ChildName, ChildField1, ChildField2
FROM
  (SELECT pt.ParentID, 0 ChildID, pt.ParentName, '' ChildName, '' ChildField1, '' ChildField2
   FROM ParentTable pt
   UNION
  SELECT ct.ParentID, ct.ChildID, '   ' ParentName, ct.ChildName, ct.ChildField1, ct.ChildField2
  FROM ChildTable ct)

ORDER BY ParentID, ChildID

Стандартный отказ от ответственности: SQL на самом деле не предназначен для форматирования вывода, поэтому, если вы можете перенести ответственность за табуляцию / отступ на уровень представления, это обычно лучше. Но если вы должны сделать это в SQL (а иногда мы должны!), Этот подход должен помочь. :)

Удачи!

0 голосов
/ 19 июля 2011

Может быть, это поможет

Данные испытаний:

declare @t table(var1 varchar(20), var2 varchar(20), var3 varchar(20))

insert @t values('ParentA', null, null)
insert @t values('ParentA', 'a', 'b')
insert @t values('ParentA', 'c', 'd')
insert @t values('ParentA', 'e', 'f')
insert @t values('ParentB', null, null)
insert @t values('ParentB', 'g', 'h')
insert @t values('ParentB', 'i', 'j')
insert @t values('ParentB', 'k', 'l')

Запрос:

SELECT a FROM (
SELECT var1 a, 1 s , var1
FROM @t 
WHERE var2 is NULL
UNION ALL
SELECT 'ChildOf' + var1 + '_' + CAST(RN AS VARCHAR) + ' ' + var2 + ' ' + var3, 2, var1
FROM 
(SELECT *, 
RN = ROW_NUMBER() OVER (PARTITION BY VAR1 ORDER BY (SELECT 1))
FROM @t where var2 is not null
) t
) b ORDER BY var1, s
0 голосов
/ 19 июля 2011

Не существует такой вещи, как строка, которая содержит только одно поле в наборе результатов для нескольких полей (даже с использованием временных таблиц и курсоров).

Вы можете установить для других полей значение NULL для родительской записи.

SELECT Name, FieldA, FieldB
FROM (
    SELECT 1 Type, p.ID ID, NULL SubID, p.Name Name, NULL FieldA, NULL FieldB
    FROM hierarchyTable p
    WHERE p.ParentID IS NULL
    UNION ALL SELECT 2, c.ParentID, c.ID, c.Name, FieldA, FieldB
    FROM hierarchyTable c
    WHERE c.ParentID IS NOT NULL
) rs
ORDER BY ID, Type, SubID

В качестве альтернативы вы можете использовать один запрос:

SELECT Name,
    CASE WHEN ParentID IS NULL
        THEN NULL
        ELSE FieldA
    END AS FieldA,
    CASE WHEN ParentID IS NULL
        THEN NULL
        ELSE FieldB
    END AS FieldB
FROM hierarchyTable
ORDER BY COALESCE(ParentID, ID),
    CASE WHEN ParentID IS NULL THEN 0 ELSE 1 END,
    ID
...