【发布时间】:2012-11-29 12:33:41
【问题描述】:
我正在尝试使用以下示例数据在 SQL Server 中执行递归 CTE
Class Student
------ ------
English Sally <- Sally is what were searching for
English Peter <- Peter's on same Class as Sally
Swedish Peter <- Found because Peter's on this class
Dutch Peter <- Found because Peter's on this class
Finnish Harry <- Not found, no relation to class or student
Swedish Tim <- Found because Peter's on Swedish class
Spanish Lauren <- Not found, no relation to class or student
Spanish Colin <- Not found, no relation to class or student
所以我需要一个 CTE,我将“Sally”作为参数,它会找出与 Sally 相关的所有不同班级,然后是与 Sally 所在班级相关的所有学生,然后是与学生相关的所有班级与 Sally 相同的类,依此类推,直到找不到更多行。
但我只是不知道如何编写连接,这是我尝试过但惨败的方法:
WITH myCTE (Class, Student) AS
(
SELECT Class, Student FROM TABLE1 WHERE TABLE1.Student= 'Sally'
UNION ALL
SELECT t.Class, t.Student FROM TABLE1 t
JOIN myCTE t2 ON t2.Class = t.Class
)
SELECT * FROM myCTE
【问题讨论】:
-
请添加预期的输出。
-
本例中的预期结果是示例数据中的所有字段,因为值 1 有 'A' 和 'B',而值 'B' 在 Field1 中有值 1,2 和 3。我的示例代码中的问题是它无限循环,并且在没有找到新事件时不会停止。
-
我认为您的数据集太小,无法清楚地说明您要做什么。请添加一些行,例如(4,C) (3,D) (10,A) 并告诉我们查询应该从该输入输出什么(以及为什么)。
-
好的,编辑并写了应该找到哪些行。我可以使用 while 循环或光标来做到这一点,但我认为 CTE 会更专业!
标签: sql sql-server common-table-expression