使用功能从另一个表创建连接表

时间:2019-06-01 06:50:35

标签: sql sql-server

我有一个函数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个输出串联起来

1 个答案:

答案 0 :(得分:3)

您可以使用CROSS APPLY根据另一个表中的行从一个表值函数返回并合并多个结果集。在您的示例中,它看起来像:

SELECT c.*
FROM deleted d
CROSS APPLY GetChildren(d.Id) c