SQL如何将两个单独的表分组以获得此输出

SQL如何将两个单独的表分组以获得此输出,sql,sql-server-2008,pivot,Sql,Sql Server 2008,Pivot,好的,我只想描绘一幅我正在努力实现的图景 我有一个XML文件: <root> <item id="test1" level="1" /> <item id="test2" level="1"> <item id="test3" level="2" /> <item id="test4" level="2" > <item id="test5" level="3

好的,我只想描绘一幅我正在努力实现的图景

我有一个XML文件:

<root>
    <item id="test1" level="1" />
    <item id="test2" level="1">
        <item id="test3" level="2" />
        <item id="test4" level="2" >
            <item id="test5" level="3">
                <item id="test6" level="4" />
            </item>
        </item>
        <item id="test7" level=2" />
    </item>
</root>
现在,表B如下所示:

    GUID                                |  ID
    -----------------------------------------------
   c567207d-5317-4d0e-b24d-5ae3f7fa5691    test1
   4567207d-4317-4d6e-b25d-7ae3f7fa5691    test3
   a7b94a42-fb00-4011-bd5a-4b48e6e578c5    test1
   fa7989d7-1708-4a90-9bf6-c91f6cef6952    test2
   8a7989d7-5608-5690-9bf6-591f6ce56852    test7
   gta7b94a42-fb00-4011-bd5a-4b48e6e578    test6
我想写一个select语句,使用上面的表a和表B得到如下结果:

    GUID                                |  ID
    -----------------------------------------------
   c567207d-5317-4d0e-b24d-5ae3f7fa5691    test1
   4567207d-4317-4d6e-b25d-7ae3f7fa5691    test3
   a7b94a42-fb00-4011-bd5a-4b48e6e578c5    test1
   fa7989d7-1708-4a90-9bf6-c91f6cef6952    test2
   8a7989d7-5608-5690-9bf6-591f6ce56852    test7
   gta7b94a42-fb00-4011-bd5a-4b48e6e578    test6
编辑:基本上将其视为文件路径,我想找到ID的路径

所以基本上对于ID:test6

路径应该是test2->test4->test5->test6

    GUID                                |  ID  |   ID_Level_1  | ID_Level_2 | ID_Level_3 | ID_Level_4    
    ---------------------------------------------------------------------------------------------------------
   c567207d-5317-4d0e-b24d-5ae3f7fa5691    test1       test1
   4567207d-4317-4d6e-b25d-7ae3f7fa5691    test3       test2     test3  
   a7b94a42-fb00-4011-bd5a-4b48e6e578c5    test1       test1     
   fa7989d7-1708-4a90-9bf6-c91f6cef6952    test2       test2
   8a7989d7-5608-5690-9bf6-591f6ce56852    test7       test2     test7
   gta7b94a42-fb00-4011-bd5a-4b48e6e578    test6       test2     test4           test5          test6

如何实现这个结果,使用表A和表B,需要什么样的SQL调用才能获得上面的结果?

如果不调整存储过程示例,它可能会为您提供一个良好的开始,让您可以开始您想要做的事情

它处理一种循环方法,即获取递归分层查询并为所有尚未处理的记录填充结果表。您必须对其进行调整,我建议您在需要更深入的每个级别上,为下一个要运行它的列添加一个“altertableadd”。您甚至可能需要进入动态SQL,因为您的列名将不断消失。

诀窍是使用一种新方法。只需剪切并粘贴以下代码,它将创建2个临时表,而不会删除它们。然后使用递归cte和select语句来获取所需内容。如果这不是你需要的,请告诉我

CREATE TABLE #tempA (ID VARCHAR(20) ,PARENTID VARCHAR(20),[LEVEL] INT)

INSERT INTO #TEMPa
VALUES( 'TEST1',NULL,1)

INSERT INTO #TEMPa
VALUES( 'TEST2',NULL,1)

INSERT INTO #TEMPa
VALUES ('TEST3','TEST2',2)

INSERT INTO #TEMPa
VALUES( 'TEST4','TEST2',2)

INSERT INTO #TEMPa
VALUES ('TEST5','TEST4',3)

INSERT INTO #TEMPa
VALUES ('TEST6','TEST5',4)

INSERT INTO #TEMPa
VALUES ('TEST7','TEST2',2)

create table #tableb(guid varchar(50), id varchar(50));
insert into #tableb values ('c567207d-5317-4d0e-b24d-5ae3f7fa5691',    'test1');
insert into #tableb values ('4567207d-4317-4d6e-b25d-7ae3f7fa5691',    'test3');
insert into #tableb values ('a7b94a42-fb00-4011-bd5a-4b48e6e578c5',    'test1');
insert into #tableb values ('fa7989d7-1708-4a90-9bf6-c91f6cef6952',    'test2');
insert into #tableb values ('8a7989d7-5608-5690-9bf6-591f6ce56852',    'test7');
insert into #tableb values ('gta7b94a42-fb00-4011-bd5a-4b48e6e578',   'test6');

;WITH coolRecursionCTE as
(
SELECT a.id,a.parentid,a.id as TargetElement, 1 AS level,convert(varchar(max),a.parentid) as [path]
FROM #tempA AS a
UNION ALL
SELECT a.ID,a.parentid,c.TargetElement,c.Level+1,convert(varchar(max),a.parentid) +'->' + c.[path]   as [path]
FROM #tempA AS a 
INNER JOIN  coolRecursionCTE AS c ON c.parentid = a.id
where a.parentid is not null
)



SELECT [targetelement], [path] + '->'+[targetelement] FROM coolRecursionCTE AS c
INNER JOIN
(
select targetElement as t , max([level]) as maxLevel from coolRecursionCTE
group by TargetElement) AS E on c.TargetElement = e.t and c.[level] = e.maxLevel 

我理解您想要的基本逻辑,但我想知道为什么test3作为ID的行会带来所有其他ID?还有,为什么test3和test4一起在级别2上?在最终结果中,级别的工作方式是,它必须从该ID的最上面的父级开始,然后一直工作到最低级别OK,我现在理解了逻辑。这比我一开始想象的要复杂得多。你需要关注ID_级别1,ID_级别2,。。。。?或者您可以使用Guid | ID | Level | LevelID,例如x | test2 | 2 | test3、test4?@gh9不确定这到底是什么意思?你能详细说明一下吗?我认为不需要动态表,因为根据已经定义的结构,你最多只能有4个级别,但如果没有数据表示该列,我想隐藏列名。我认为你的基本功能非常接近解决方案,但是你能调整一下它吗?如何让数据显示为我的最终结果,我需要它们在单独的列中,而不是->中,而且我还需要有表B中匹配的GUID,所以基本上我希望最终结果与我上面发布的结果完全一样。另外,与你的结果有一些不一致之处,例如,test6和test5有一个错误,层次结构不正确。@prakash当我问你是否需要透视时,你说格式x->y->z是可以接受的。情况不再是这样了?我的意思是,我希望它显示为列1、列2、列3、列4,而不是显示所有内容的列1。例如,test5在列_1=test2、列_2=test4、列_3=test5Yes中有值,这称为数据透视。您真的需要透视还是可以让应用程序运行拆分?