SQL:查找表中缺失的层次结构文件夹(路径)

2024-04-01

我有一个包含文件夹路径的表。 我需要找到层次结构中这些文件夹之间的所有“间隙”。 我的意思是,如果表包含这 3 个文件夹:

'A'
'A\B\C'
'A\B\C\D\E\F\G'

我需要在层次结构中找到以下丢失的文件夹:

'A\B'
'A\B\C\D'
'A\B\C\D\E'
'A\B\C\D\E\F'

该表包含超过250,000 条记录文件夹,所以我们寻找最多的高效的这样做,否则脚本会卡住很长时间,我们没有时间。

评论:我没有所有文件夹的列表。我拥有的是“根”文件夹和“叶子”文件夹,我需要在层次结构中找到它们之间的“间隙”。

第二条评论:该表可以包含不止一个层次结构我们需要找到其中的“差距”所有的层次结构。 就此而言,还有另外 2 个 int 列:“DirID”和“BaseDirID”。 “DirID”列是我们表中的 id 列。 “BaseDirID”包含层次结构中第一个文件夹的 ID。因此,同一层次结构中的所有文件夹(路径)在此列中共享相同的值。样本数据例如:

DirID   BaseDirID   DisplayPath
1   1   'A'
2   1   'A\B\C'
3   1   'A\B\C\D\E'
4   4   'U'
5   4   'U\V\W'
6   4   'U\V\W\X\Y'

所以我们需要找到以下数据:

BaseDirID   DisplayPath
1   'A\B'
1   'A\B\C\D'
4   'U\V'
4   'U\V\W\X'

提前致谢。


这是一种使用的方法Recursive CTE和分割字符串函数

;WITH existing_hierachies
     AS (SELECT DirID,
                BaseDirID,
                DisplayPath
         FROM   (VALUES (1,1,'A' ),
                        (2,1,'A\B\C' ),
                        (3,1,'A\B\C\D\E' ),
                        (4,4,'U' ),
                        (5,4,'U\V\W' ),
                        (6,4,'U\V\W\X\Y' )) tc (DirID, BaseDirID, DisplayPath) ),
     folders_list
     AS (SELECT ItemNumber,
                item fol,
                BaseDirID
         FROM   (SELECT row_number()over(partition by BaseDirID order by Len(DisplayPath) DESC)rn,*
                 FROM   existing_hierachies) a
                 CROSS apply dbo.[Delimitedsplit8k](DisplayPath, '\')
                 Where Rn = 1),
     rec_cte
     AS (SELECT *,
                Cast(fol AS VARCHAR(4000))AS hierar
         FROM   folders_list
         WHERE  ItemNumber = 1
         UNION ALL
         SELECT d.*,
                Cast(rc.hierar + '\' + d.fol AS VARCHAR(4000))
         FROM   rec_cte rc
                JOIN folders_list d
                  ON rc.BaseDirID = d.BaseDirID
                  AND d.ItemNumber = rc.ItemNumber + 1)
SELECT rc.BaseDirID,
       rc.hierar AS Missing_Hierarchies
FROM   rec_cte rc
WHERE  NOT EXISTS (SELECT 1
                   FROM   existing_hierachies eh 
                   WHERE  eh.BaseDirID = rc.BaseDirID 
                     AND  eh.DisplayPath = rc.hierar) 
Order by rc.BaseDirID

Result :

+-----------+---------------------+
| BaseDirID | Missing_Hierarchies |
+-----------+---------------------+
|         1 | A\B                 |
|         1 | A\B\C\D             |
|         4 | U\V                 |
|         4 | U\V\W\X             |
+-----------+---------------------+

分割字符串功能码

CREATE FUNCTION [dbo].[DelimitedSplit8K]
        (@pString VARCHAR(8000), @pDelimiter CHAR(1))
RETURNS TABLE WITH SCHEMABINDING AS
 RETURN
--===== "Inline" CTE Driven "Tally Table" produces values from 0 up to 10,000...
     -- enough to cover NVARCHAR(4000)
  WITH E1(N) AS (
                 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
                 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
                 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
                ),                          --10E+1 or 10 rows
       E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
       E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
 cteTally(N) AS (--==== This provides the "base" CTE and limits the number of rows right up front
                     -- for both a performance gain and prevention of accidental "overruns"
                 SELECT TOP (ISNULL(DATALENGTH(@pString),0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
                ),
cteStart(N1) AS (--==== This returns N+1 (starting position of each "element" just once for each delimiter)
                 SELECT 1 UNION ALL
                 SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) = @pDelimiter
                ),
cteLen(N1,L1) AS(--==== Return start and length (for use in substring)
                 SELECT s.N1,
                        ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0)-s.N1,8000)
                   FROM cteStart s
                )
--===== Do the actual split. The ISNULL/NULLIF combo handles the length for the final element when no delimiter is found.
 SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
        Item       = SUBSTRING(@pString, l.N1, l.L1)
   FROM cteLen l
;
GO

转介自http://www.sqlservercentral.com/articles/Tally+Table/72993/ http://www.sqlservercentral.com/articles/Tally+Table/72993/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL:查找表中缺失的层次结构文件夹(路径) 的相关文章

随机推荐

  • 如何在 UNIX shell 中将制表符分隔的文本复制到剪贴板,同时保留制表符?

    我正在尝试将 UNIX 环境中的文件的几行复制并粘贴到网页中 我想通过破坏选项卡来保留原始格式 但是 当我选择一段文本并将其复制并粘贴到网页中时 所有选项卡都已转换为不同长度的空格 有人可以告诉我如何保留原始标签吗 它需要尽可能简单 以便新
  • 数据库表命名,复数或单数[重复]

    这个问题在这里已经有答案了 命名数据库的表和模式时最好使用单数或复数 例如 应该是客户还是客户 命名时应该用Capital 如Customer或customer吗 关于命名有什么最佳实践吗 这个问题需要一场宗教战争 我毫不怀疑它应该是复数
  • C++11 空列表 联合的初始化 - 是否保证初始化联合的完整长度?

    在 C 11 中 我有以下联合 union SomeData std uint8 t Byte std uint16 t Word std uint32 t DWord unsigned char String 128 如果我这样初始化联合
  • Git checkout——恢复丢失的文件

    我不小心删除了 git 存储库上的本地文件更改 他们没有被承诺 甚至没有被推动 我做了什么 git 状态 然后显示未暂存提交的文件 并且我意外地通过此命令删除了名为 smdr 的整个文件夹 git checkout smdr 然后文件更改就
  • Latex中如何设置标题字体颜色

    Latex 中可以更改标题字体颜色吗 你可以看看sectsty包裹 secsty 包提供了一组命令 用于更改标准 LATEX 2 文档类中各个章节标题所使用的字体 1 从手册中 确保您在文档中包含该包 方法是在您的 文件序言 usepack
  • C++ - 如何使用 C++ 读取 Unicode 字符(例如印地语脚本),或者是否有通过其他编程语言更好的方法?

    我有一个像这样的印地语脚本文件 3 我必须编写一个程序 为每个句子中的每个单词添加一个位置 因此 特定单词位置的每一行的编号应以括号中的 1 开头 输出应该是这样的 3 1 2 3 4 5 6 7 8 9 上面这句话的意思是 3 India
  • 我需要在 asp.net 中屏蔽文本框

    该文本框中只能包含数字 条目必须在 100 到 500 之间 文本框需要包含 3 位小数 我不希望在将值插入数据库时 出现任何错误 我需要使用 jQuery 或 ASP NET 验证控件吗 如果 jQuery 有用 那么我会使用哪个插件 或
  • R 中的对称非负矩阵分解

    I am trying to implement NMF in R based on the following formula H is initially guess and then iteratively update based
  • 何时在 Angular + Java 项目中使用 DTO 和 Matpstruct

    好吧 我有一个大项目 我想把它做好 但我什至不知道规范是什么 Problem 我有几个具有关系的实体 我需要将它们一起显示在页面上 在视图中显示前 3 个事件 凡是Event有关系到事件实例 a 取消政策 并且对多个Pricing 截止日期
  • 获取用户在当前之前浏览过的页面

    代替 login php ref http mysite com lastpage 我可以通过其他方式获得之前的页面吗 尝试了 HTTP REFERER 但无法让它工作 Notice Undefined index HTTP REFERER
  • 渲染 svg 文件并使用 Express 提供服务

    我想知道如何使用 Express 渲染和提供 svg 文件 现在 我可以将 svg 作为原始 XML 文件提供 这是我正在做的事情 route router get status function req res next res setH
  • Rails 中的共享 JS(咖啡)

    如果我想在不同文件之间共享一些 JavaScript 函数应用程序 资产 javascript组织目录结构的最佳方法是什么 假设我有共享 js 咖啡 sharedFunction gt Hello 现在 我如何在其他地方使用它 就像这里一样
  • Solr 复制和 Solr 云有什么区别?

    我支持 Rails 项目 其中包含 Rails 应用程序和 Solr 的附加实例 我的环境 rails 3 2 1 ruby 2 1 2 sunspot 2 1 0 Solr 4 1 6 Problem 云提供商不稳定 我不能使用其他云提供
  • Pandas groupby - 计算相对点的距离

    假设我有一些看起来像这样的东西 df pd DataFrame Event A A A A A B B B B B Number 1 2 3 4 5 6 7 8 9 10 Ref False False False False True F
  • Nexus One - Android 2.1 版本,2.1 的 SDK 在哪里?

    搭载 2 1 操作系统的 Nexus Android 手机今天上市 我的朋友 刚刚订购了两个 隔夜运送 我想这意味着明天或后天就会在他手中 人们在他们的生活中拥有 2 1 版本 这怎么可能接受呢 在开发人员接触 SDK 之前就动手 我已经有
  • Selenium:查找基本 URL

    我在不同的机器上使用 Selenium 来自动测试 MVC Web 应用程序 我的问题是我无法获取每台机器的基本网址 我可以使用以下代码获取当前网址 IWebDriver driver new FirefoxDriver string cu
  • 80 端口上的 heroku + nginx

    我正在尝试在 heroku 免费环境中启动 nginx 服务器 我准备了任何操作方法和教程 但我无法运行它 首先 我想在端口 80 上启动 nginx 作为默认 Web 服务器 然后我想将 nginx 配置为 underline expre
  • 3个表之间的内连接

    我在数据库中有这些表 country id country 1 USA 2 Brazil 和段表 id country 1 USA 2 Brazil 我有第三张表 Id segment id country id 其中segment id是
  • GSON 转换为 LinkedHashMap 而不是我的对象

    我有这段代码 public abstract class Repository
  • SQL:查找表中缺失的层次结构文件夹(路径)

    我有一个包含文件夹路径的表 我需要找到层次结构中这些文件夹之间的所有 间隙 我的意思是 如果表包含这 3 个文件夹 A A B C A B C D E F G 我需要在层次结构中找到以下丢失的文件夹 A B A B C D A B C D