Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql T-SQL:如何以某种格式返回父记录和子记录?_Tsql_Grouping_Hierarchy - Fatal编程技术网

Tsql T-SQL:如何以某种格式返回父记录和子记录?

Tsql T-SQL:如何以某种格式返回父记录和子记录?,tsql,grouping,hierarchy,Tsql,Grouping,Hierarchy,使用T-SQL,是否可以编写一个返回如下结果的查询 Parent A ChildOfParentA_1 ChildField1 ChildField2 ChildOfParentA_2 ChildField1 ChildField2 ChildOfParentA_3 ChildField1 ChildField2 Parent B ChildOfParentB_1 ChildField1 ChildField2 ChildOfPare

使用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 父A 家长子女1子女字段1子女字段2 家长子女2子女字段1子女字段2 家长子女3子女字段1子女字段2 父母B 家长子女1子女字段1子女字段2 家长子女2子女字段1子女字段2 家长子女3子女字段1子女字段2 在这些结果中,有一行对于每个父记录只包含一个字段,额外的字段设置为NULL。然后,在父记录下面,有一行子记录,它有三个字段


我知道如何使用临时表和游标来实现这一点,但如果可能的话,我真的希望有一个查询以这种格式返回此信息。

在多字段结果集中,没有只包含一个字段的行(即使使用临时表和游标)

对于父记录,可以将其他字段设置为
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

我假设父记录和子记录位于不同的表中,并且可以由驻留在两个表中的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中执行此操作(有时我们也必须这样做!),那么这种方法应该可以做到这一点


祝你好运

也许这会奏效

测试数据:

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

“结果集中不存在只包含一个字段的行……”对,我的错。我的意思是其他两个字段将为空。很抱歉给你带来了困惑。并且,感谢您提供的解决方案。我来试试。谢谢你,迈克尔。我真的,真的,真的希望我能在演示代码中处理这些东西,但不幸的是,这不是我的选择。不过,我还是投票赞成这个伟大的建议。我会试试你提出的解决方案。