首页 > 解决方案 > 使用函数从另一个表创建连接表

问题描述

我有一个函数GetChildren(@id uniqueidentifier),它返回一个节点表和一个从删除触发器中删除的父表我想制作一个大节点表,为每一行连接 GetChildren 的输出。删除的 ID,我该怎么做?请说出如何仅以纯 sql 方式使其没有变量和循环

我想要类似于 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 个输出

标签: sqlsql-server

解决方案


您可以使用CROSS APPLY根据另一个表中的行从一个表值函数返回和合并多个结果集。在您的示例中,如下所示:

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

推荐阅读