0

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

第一个是 Children 包含以下行 ID、Name、Age、FatherID、SchoolID

第二个包含他们父亲的数据,比如这个父亲ID、姓名、年龄

第三个是带有 SchoolID 和 SchoolName、Address 等的 School。

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

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

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

*Cursor 正在处理两个临时表,第一步将具有给定 schoolid 的孩子选择到一个临时表中(@tempfamilymembers)。

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

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

然后,我可以从@tempfamilymembers中选择所有来完成查询*

基于游标的解决方案太难了,而且相对较慢,而且我听说 while 循环显示出更好的性能,而基于集合的方法会更好。

我的问题是:我可以在不创建游标的情况下以某种方式实现这一目标吗? (即使他有多个孩子,我也只想列出此列表中出现的父亲一次。)

4

1 回答 1

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,您可以对其进行测试。让我知道你的想法。

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

  • 正如我最初在评论CTE 's/UNION ALL中提到的那样,还有很长的路要走。;-)

于 2019-02-18T18:37:23.750 回答