当查询是分层的时,是否可以替换 SQL 中的游标?

Is it possible to replace cursor in SQL when the query is hierarchical?

我在MsSQL中有3个table来存储数据。

第一个是 Children 包含以下行 ID, 名称, 年龄, 父亲身份证, 学号

第二个是他们父亲的数据,像这样 父亲身份证, 名称, 年龄

第三个是School,有SchoolID和SchoolName, Address等

(关系是:多个children可以有同一个父亲,很明显:))

我要列出的是与给定SchoolID相关的所有家庭成员。

我知道一个基于游标的解决方案:

*游标正在使用两个临时 tables,第一步 selecting children 将给定的 schoolid 合并为一个临时 table(@tempfamilymembers)。

第二步是 select 来自这个 table 的不同 fatherids 并将其保存到第二个临时 table(@fatherids).

然后,我将遍历这些 fatherids,将具有匹配 fatherids(来自@fatherids)的父亲插入第一个临时 table(@tempfamilymembers)。

然后,我可以select全部来自@tempfamilymembers来完成查询*

基于游标的解决方案太难了,而且比较慢加上 我听说 while 循环表现出更好的性能,set-based 方法会更好。

我的问题是:我能否以某种方式实现此目的而不创建游标? (我只想列出此列表中在场的父亲一次,即使他有多个children。)

WITH family_members (id, name, age, role) AS
(
  SELECT FatherID, Name, Age, 'father'
  FROM Fathers 
  WHERE FatherID IN(SELECT DISTINCT FatherID
                    FROM Children 
                    WHERE SchoolID = 1) -- 1) Put School to search here
  UNION ALL
  SELECT ID, Name, Age, 'child '
  FROM Children
  WHERE SchoolID = 1 -- 2) Put School to search here
)
SELECT * FROM family_members
  • 如果您要在 rextester 中放入一些数据,您可以对此进行测试。 让我知道你的想法。

  • 如果列的类型不同(Children 与父亲),您可能需要 CAST 列。

  • 正如我最初在评论中提到的那样 CTE's/UNION ALL 都可以。 ;-)