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

SQL-如何在自引用表中获取给定值的顶级父项

谯志诚
2023-03-14
问题内容

我有这个小问题。

该表基本上如下所示

学科

  • SubjectId
  • SubjectName
  • ParentSubjectId

ParentSubjectId引用主题表本身。并且可以下降很多级别(没有特定数量的级别)

示例(仅出于示例目的,使用国家/地区):

  1.Europe
  2.America
  1.1 France
  1.1 Italy
  2.1 USA
  2.2 Canada
  1.1.1 Paris
  1.2.1 Rome

等等..

SubjectID是GUID ParentSubjectID也是GUID。

样本概述:http :
//i.imgur.com/a2u2CfT.png

它甚至可以无限期降低水平(甚至可以降低到街道号​​的水平)

我的问题是:给定一个主题(无论深度如何)。我想获得该学科的顶级家长(Europe/America在这种情况下)

我怎样才能做到这一点 ?是否可以使用基本SQL查询?

请注意,我根本无法修改数据库(我正在从现有数据库中查询数据)


问题答案:

写为:

declare @Subject as varchar(max)
set @Subject = 'Rome'; -- set subject name here

WITH SubjectCTE AS
(
SELECT SubjectId , SubjectName , ParentSubjectId
FROM Subject
WHERE SubjectName = @Subject 
UNION ALL
SELECT C.SubjectId , C.SubjectName , C.ParentSubjectId
FROM SubjectCTE AS P
JOIN Subject AS C
ON P.ParentSubjectId = C.SubjectId
)
,SubjectCTE2 as 
(
SELECT SubjectId , SubjectName , ParentSubjectId, 
       Row_Number() over ( order by SubjectId asc) as rownum
FROM SubjectCTE
)
select SubjectName as RequiredParentName
from SubjectCTE2
where rownum =1

在这里查看演示。



 类似资料:
  • 问题内容: 嗨,我有一个引用自己的表,我需要能够从给定的父ID中选择父及其所有子记录。 我的表如下: 因此,对于上面的示例,我希望能够传递值1并获取上面的所有记录。 到目前为止,我已经提出了以下递归表值函数,但是它的行为不符合预期(仅返回第一条记录)。 问题答案: 你可以试试这个

  • 我想使用JOOQ递归地获取自引用表的父级和子级。 目标是直接在POJO中获取。 我没有在JOOQ留档或其他任何地方找到任何这样的例子,但我认为结合多集和递归JOOQ方法是可能的。https://www.jooq.org/doc/3.14/manual/sql-building/sql-statements/with-recursive-clause/https://www.jooq.org/doc

  • 问题内容: 考虑一个虚拟情况: 单击按钮后,获取的内容将成功更新。 但是,如果我在此处添加,它将不再起作用: 相反,它得到: 但是,该组件确实具有该ID,因此EL应该没问题。不知何故打破了案件。是否有可能在实际循环之前尝试评估EL? 您如何从dataTable中引用元素? 注意:我最近询问了ui:repeat中奇怪的dataTable命名问题,事实证明这是一个bug。这个问题不应该然而,因为我是一

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

  • 我想知道是否有一种简单的方法可以从特定的窗口获得所有的顶层,包括顶层内的顶层。在下面的代码中,我留下了一个我想做的例子: Tkinter中是否有实现这一点的内置功能?

  • 问题内容: 我如何平均?我想找到的平均值,学生总数和的总数。例: 输入 :4 4 4 4 产出: 学生总数 :4 总GPA :16 平均GPA: 4 问题答案: 如果问题是您得到错误的答案,则原因是此循环: 大概您打算在用户输入负数时退出循环。这样做有问题,它将在总数和计数中包含负数。您可以这样重写循环: (其他解决方案也是可能的)。在代码的后面,您将需要防止第一个数字为负。如果发生这种情况,将为