当前位置: 首页 > 面试题库 >

在SQL Server中查找顶级父级的最有效方法?

冀萧迟
2023-03-14
问题内容

给出下表

catName     catID     parentID
=================================
vehicles    1         0
cars        2         1
sedans      3         2
animals     4         0
cows        5         4

给定一个catID,我需要找到其顶级父级(parentID = 0)。

每天执行50-100次此查询。当前有100-200行(将来可能会更多)。多达8个层次的深度。我在考虑三种选择:

  1. 使用递归方法
  2. 创建一个视图
  3. 添加另一列topParentID(最不满意)

哪个效率最高?


问题答案:

SQL2008 +:

为了存储层次结构,SQL Server包含HIERARCHYID数据类型。可以将上述数据“转换为”以使用HIERARCHYID“值”:

catName     catID     parentID  hierarchyNode
=============================================
vehicles    1         0         /1/
cars        2         1         /1/2/
sedans      3         2         /1/2/3/
animals     4         0         /4/
cows        5         4         /4/5/

转换后,我将删除parentID列。

HIERARCHYID是SQLCLR系统数据类型,其中包括以下方法:

  • HidValue。GetLevel()
  • HidValue。GetAncestor(level)。

为了获得父节点,我将使用以下方法:

DECLARE @node HIERARCHYID
SET     @node = '/1/2/3/'

SELECT  
    currentNodeLvl= @node.GetLevel(),                                 --> 3
    parentAsHID   = @node.GetAncestor(@node.GetLevel() - 1),          --> 0x58
    parentAsString= @node.GetAncestor(@node.GetLevel() - 1).ToString()--> /1/

此外,我将在hierarchyNode列上创建索引,因此:

CREATE UNIQUE INDEX IUN_Table_hierarchyNode
ON dbo.Table(hierarchyNode)

最后的查询将是:

SELECT ..., prt.catID AS parentID
FROM dbo.Table crt -- Curent node
LEFT/INNER JOIN -- It depends on hierarchyID nullability 
dbo.MyTable prt -- Parent node
ON @node.GetAncestor(crt.hierarchyID.GetLevel() - 1).ToString() = prt.hierarchyID


 类似资料:
  • 问题内容: 我有以下两个表 表人 表关系层次结构 这将形成树状结构 ParentId和ChildId是人员表的ID列的外键 我需要编写可以获取顶级父级(即每个人的根源)的SQL。 遵循CTE可以针对每个用户执行此操作。我将其转换为一个功能,并为Person的每一行运行了它。我在Person表中大约有3k行,大约需要10秒。任何人都可以建议一种可以减少花费的方法。问题是CTE运行3k次后运行的功能

  • 我有 2 个实体(父实体和子实体),它们之间具有一对多关系。 “父项具有子项列表”,“子项具有父项”字段。 孩子有 在父字段中。 家长有 在子列表中。 我想找到一种方法,用另一个家长替换一个孩子的家长。(即将子女A的父母从父母A变更为父母B) 因为我想遵循父列表,所以我想从列表中删除子项。问题是,即使我首先将ChildA添加到ParentB的列表中,也要将ChildA的Parent字段设置为Par

  • 我希望在BST中找到具有特定值的节点的父节点。我的节点类具有左右属性项(即值/键)。 查找父级的想法是这样的: 1)如果值(key)不存在,则返回无,无 2)如果根等于值(key),则返回无,根 3)否则查找值(key)并返回(par, node),其中par是父级和节点 我的函数是这样的: 当 为“无”时,如何处理该问题?

  • 我有一个Java8中的多线程Http服务器,它每秒获得数千个请求,并且必须创建需要字符串连接的响应。这个问题最好(最快)的解决方案是什么? 我知道,通常比操作符具有更好的性能,我认为StringBuilder将是最好的解决方案,但在这种情况下,我必须为每个请求初始化新的StringBuilder。 而且,在我的问题中,串联总是需要3个字符串-其中两个是final字符串,中间一个是变量。该变量可以从

  • 最有效的方法是只使用纯javascript查找特定父元素的子元素(带有类或ID)。没有jQuery或其他框架。 在这种情况下,我需要找到parent的child1或child2,假设DOM树中可以有多个child1或child2类元素。我只想要父母的元素

  • 我在为分配从头创建的优先级队列类中有一个remove方法。我创建的优先级队列保存在一个数组中,索引从0开始。我跟踪等于数组长度的大小。remove方法使用名为的助手方法: 其中parent是数组中存储父元素的位置,我希望返回其最小的子元素。顺序就是每个非叶子节点的子节点数。我发现最小的代码: 它目前是我创建的PriorityQueue类的数组越界异常完整实现: Main包括我测试代码的3种不同方式