【发布时间】:2020-10-05 19:42:52
【问题描述】:
假设我有以下分层表:
+-------+----------+-------+-------------------------+-----------------+--------+
| ID | ParentID | Name | Path | InheritanceFlag | ToEdit |
+-------+----------+-------+-------------------------+-----------------+--------+
| 76938 | NULL | 1 | (76938) | 1 | X |
+-------+----------+-------+-------------------------+-----------------+--------+
| 76942 | 76938 | 1.1 | (76938)\(76942) | 1 | 1 |
+-------+----------+-------+-------------------------+-----------------+--------+
| 76952 | 76942 | 1.1.1 | (76938)\(76942)\(76952) | 0 | 0 |
+-------+----------+-------+-------------------------+-----------------+--------+
| 76961 | 76942 | 1.1.2 | (76938)\(76942)\(76961) | 1 | 1 |
+-------+----------+-------+-------------------------+-----------------+--------+
| 76943 | 76938 | 1.2 | (76938)\(76943) | 1 | 1 |
+-------+----------+-------+-------------------------+-----------------+--------+
| 76944 | 76938 | 1.3 | (76938)\(76944) | 0 | 0 |
+-------+----------+-------+-------------------------+-----------------+--------+
| 76946 | 76944 | 1.3.1 | (76938)\(76944)\(76946) | 1 | 0 |
+-------+----------+-------+-------------------------+-----------------+--------+
| 76947 | 76944 | 1.3.2 | (76938)\(76944)\(76947) | 0 | 0 |
+-------+----------+-------+-------------------------+-----------------+--------+
| 76948 | 76944 | 1.3.3 | (76938)\(76944)\(76948) | 1 | 0 |
+-------+----------+-------+-------------------------+-----------------+--------+
| 76945 | 76938 | 1.4 | (76938)\(76945) | 1 | 1 |
+-------+----------+-------+-------------------------+-----------------+--------+
我的输入是一个 ID 表(它是我转换的 JSON 字符串),我想选择这些 ID 及其后代(孩子和孩子的孩子等)。例如,如果 ID 是 76942 和 76946,它应该向我返回以下行:
+-------+----------+-------+-------------------------+-----------------+--------+
| ID | ParentID | Name | Path | InheritanceFlag | ToEdit |
+-------+----------+-------+-------------------------+-----------------+--------+
| 76942 | 76938 | 1.1 | (76938)\(76942) | 1 | 1 |
+-------+----------+-------+-------------------------+-----------------+--------+
| 76952 | 76942 | 1.1.1 | (76938)\(76942)\(76952) | 0 | 0 |
+-------+----------+-------+-------------------------+-----------------+--------+
| 76961 | 76942 | 1.1.2 | (76938)\(76942)\(76961) | 1 | 1 |
+-------+----------+-------+-------------------------+-----------------+--------+
| 76946 | 76944 | 1.3.1 | (76938)\(76944)\(76946) | 1 | 0 |
+-------+----------+-------+-------------------------+-----------------+--------+
我怎样才能创建这个查询?我以前用简单的LIKE 和Path 来做,但由于它现在是一个列表,我不能使用它。
SELECT
[pkID]
FROM
[dbo].[t_Activites]
WHERE
[sFullPath] LIKE CONCAT('%(', @id, ')%')
对于那些对 CROSS APPLY 解决方案感兴趣的人,这里就是。我运行了执行计划,效率更高。
SELECT A.pkID
FROM t_Activites A
CROSS APPLY @Ids
JOIN t_Activites A1
ON A1.pkID = s.id
WHERE A.sFullPath LIKE CONCAT('%(', A1.pkID, ')%')
【问题讨论】:
-
@id长什么样子? -
你会想要一个你可以加入的形式的 id 和一个递归 CTE。不幸的是,后者不是我经常做的事情,无法快速给出答案,但至少这会帮助你指明正确的方向。
-
@GMB 使用@id 的示例是一个简单的
INTEGER。这就是我当时设法为 1 个 ID 做到这一点的方式。但是现在,我有一个ID列表,需要批量处理 -
@RegularNormalDayGuy:那么,这个 id 是什么样的?它是一个字符串吗?表变量?
-
@JoelCoehoorn 确实,我正在考虑使用 CTE,但我也没有足够的经验。我现在正在尝试
CROSS APPLY,如果我发现一些有用的东西我会发布
标签: sql-server subquery in-subquery