SQL连接/合并两个hierarchyid表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL连接/合并两个hierarchyid表相关的知识,希望对你有一定的参考价值。

有没有办法在SQL Server中加入/合并两个分层表?

我有两个样本表:BOMComponentDetail

declare @BOM table 
    (
      BomNode hierarchyid primary key,
      ComponentID int
    )

insert into @BOM 
values
    ('/',             NULL),
    ('/1/',           1),
    ('/1/1/',         2),
    ('/1/2/',         3),
    ('/1/3/',         4)

declare @ComponentDetail table
   (
       CompNode hierarchyid primary key,
       ComponentID int,
       SteelProductID int
   )

insert into @ComponentDetail 
values
   ('/',          NULL,NULL),
   ('/1/',        2, NULL),
   ('/1/1/',      2,1),
   ('/1/2/',      2,2)

我想要做的是临时组合这两个表只是为了查看我的应用程序中的结果:

更新:@Sean Lange我在声明Result表时犯了一个错误 - 它应该如下所示:

insert into @Result 
    values 
       ('/',     NULL, NULL),
       ('/1/',   1, NULL),
       ('/1/1/',   2, NULL),
       ('/1/1/1/', NULL, 1),
       ('/1/1/2/', NULL, 2),
       ('/1/2/',   3, NULL),
       ('/1/3/',   4, NULL)

select 
    Node.ToString() as NodeChar, ComponentID, SteelProductID 
from @Result

以下是所需输出的图表:Output diagram

任何人 ?

答案

您可以像其他任何表一样将这两个表连接在一起。在这种情况下,完全外部联接可能是您想要的。

这将从您的示例数据中返回所需的输出:

select Node = coalesce(b.BomNode.ToString(), c.CompNode.ToString())
    , ComponentID = coalesce(b.ComponentID, c.ComponentID)
    , c.SteelProductID
from @BOM b
full outer join @ComponentDetail c on c.CompNode = b.BomNode

- 编辑 -

根据我的新理解,我认为它是这样的(但它在层次结构的东西上并不完全正确,但我不清楚你想要的是什么):

select distinct Node = coalesce(b.BomNode.ToString(), c.CompNode.ToString()) + coalesce(convert(varchar(4), c.ComponentID) + '/', '')
    , ComponentID = coalesce(b.ComponentID, c.ComponentID)
    , c.SteelProductID
from @BOM b
full outer join @ComponentDetail c on b.ComponentID = c.ComponentID 

以上是关于SQL连接/合并两个hierarchyid表的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 使用 Hierarchyid 操作层次结构数据

SQL:查找hierarchyid的最低共同祖先

使用CLR函数在Visual Studio 2019中将Hierarchyid转换为字符串

SQL 2012 将来自多个表的多个查询与连接和计数合并到一个表中

如何在id上合并两个表sql?

SQL总结 连表查询