我有一个函数GetChildren(@id uniqueidentifier)
,该函数返回从删除触发器中删除的节点表和父表
我想制作一个大的节点表,将每行的GetChildren输出合并在一起。Id的已删除,该怎么办?请说出如何仅使用纯sql-way使其不包含变量和循环
我想要类似于linq c#中的SelectMany的东西
示例:
deleted
表
+-----+
| Id |
+-----+
| 111 |
+-----+
| 222 |
+-----+
Nodes
表
+-----+----------+
| Id | ParentId |
+-----+----------+
| 111 | ... |
+-----+----------+
| 222 | ... |
+-----+----------+
| 333 | ... |
+-----+----------+
| 444 | 111 |
+-----+----------+
| 555 | null |
+-----+----------+
| 666 | 222 |
+-----+----------+
GetChildren('111')
将产生:
+-----+
| Id |
+-----+
| 111 |
+-----+
| 444 |
+-----+
GetChildren('222')
将产生:
+-----+
| Id |
+-----+
| 222 |
+-----+
| 666 |
+-----+
我想要获取上面2的串联表:
+-----+
| Id |
+-----+
| 111 |
+-----+
| 444 |
+-----+
| 222 |
+-----+
| 666 |
+-----+
如果deleted
将包含4行,我想将GetChildren
的所有4个输出串联起来
答案 0 :(得分:3)
您可以使用CROSS APPLY根据另一个表中的行从一个表值函数返回并合并多个结果集。在您的示例中,它看起来像:
SELECT c.*
FROM deleted d
CROSS APPLY GetChildren(d.Id) c