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

时间:2019-02-18 16:21:28

标签: sql-server hierarchical-data database-cursor set-based

我在MsSQL中有三个表来存储数据。

第一个是儿童包含以下行 ID, 名称, 年龄, 父亲ID, 学校编号

第二个包含他们父亲的数据,像这样 父亲ID, 名称, 年龄

第三个是具有SchoolID和SchoolName,地址等的学校。

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

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

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

* Cursor正在使用两个临时表,第一步是选择子级 将给定的小学生同一个临时表(@tempfamilymembers)。

第二步是从该表中选择不同的父标识并将其保存到第二个临时表(@fatherids)。

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

然后,我可以从@tempfamilymembers中选择全部以完成查询*

基于游标的解决方案太困难了,而且速度也比较慢 我听说虽然循环显示了更好的性能,但是基于集合的方法会更好。

我的问题是:我能以某种方式实现这一目标,而无需创建光标吗? (即使他有一个以上的孩子,我也只想一次列出该列表中的父亲)。

1 个答案:

答案 0 :(得分:1)

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中放入一些数据,可以进行测试。 让我知道您的想法。

  • 如果列的类型不同(儿童vs父亲),则可能需要CAST列。

  • 正如我最初在评论中提到的那样, CTE的/ UNION ALL 是可行的。 ;-)