【问题标题】:Subquery within LIKE conditionLIKE 条件内的子查询
【发布时间】: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 是 7694276946,它应该向我返回以下行:

+-------+----------+-------+-------------------------+-----------------+--------+
| 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      |
+-------+----------+-------+-------------------------+-----------------+--------+

我怎样才能创建这个查询?我以前用简单的LIKEPath 来做,但由于它现在是一个列表,我不能使用它。

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


【解决方案1】:

如果你有一个表变量,比如@ids(id),你可以使用exists

SELECT a.pkID
FROM dbo.t_Activites a
WHERE EXISTS (SELECT 1 FROM @ids i WHERE a.sFullPath LIKE CONCAT('%(', i.id, ')%'))

【讨论】:

  • 它有效,谢谢,我设法使它与CROSS APPLY 一起工作,但您的解决方案更简单,所以我会接受它,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多