我在MsSQL中有三个表来存储数据。
第一个是儿童包含以下行 ID, 名称, 年龄, 父亲ID, 学校编号
第二个包含他们父亲的数据,像这样 父亲ID, 名称, 年龄
第三个是具有SchoolID和SchoolName,地址等的学校。
(关系是:很明显,多个孩子可以有一个父亲:))
我要列出的是与给定SchoolID相关的所有家庭成员。
我知道基于游标的解决方案:
* Cursor正在使用两个临时表,第一步是选择子级 将给定的小学生同一个临时表(@tempfamilymembers)。
第二步是从该表中选择不同的父标识并将其保存到第二个临时表(@fatherids)。
然后,我将遍历这些父亲ID,以将具有匹配父亲ID(来自@fatherids)的父亲插入到第一个临时表(@tempfamilymembers)中。
然后,我可以从@tempfamilymembers中选择全部以完成查询*
基于游标的解决方案太困难了,而且速度也比较慢 我听说虽然循环显示了更好的性能,但是基于集合的方法会更好。
我的问题是:我能以某种方式实现这一目标,而无需创建光标吗? (即使他有一个以上的孩子,我也只想一次列出该列表中的父亲)。
答案 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