基于Web的文件资源管理器回收站

时间:2019-04-17 14:32:54

标签: sql sql-server tsql

我正在创建一个用于文档管理的基于Web的文件浏览器。用户有权访问其文件,并且可以删除文件。删除后,有一个选项可以检索文件/文件夹。文件的路径使用布尔字段:IsActive存储在数据库中,该字段指示是否删除文件/文件夹。

数据库中的表格结构如下:

Name    IsDirectory IsActive     Path                              Parent
----------------------------------------------------------------------------------------------
1.txt     0           0          /Home/usr1/New Folder/1.txt       /Home/usr1/New Folder/
a         1           0          /Home/usr1/New Folder/Docs        /Home/usr1/New Folder/
2.txt     0           0          /Home/usr1/New Folder/Docs/2.txt  /Home/usr1/New Folder/Docs

如您所见,用户从“新文件夹”中删除文件(1.txt),并删除包含“ 2.txt”的文件夹“文档”。我正在显示此内容,以便用户还原或永久删除文件或文件夹。我也正在捕获文件夹/文件的父文件夹。因此,从逻辑上讲,当我显示数据时,应该看不到2.txt文件,但应看到其父文件,即Docs文件夹。

如何编写查询以获取正确的数据。我当前的查询有助于选择父对象不在“路径”中的不同父对象,然后将其加入以获取记录。

WITH parents AS
    (SELECT DISTINCT par.Parent
        FROM   tblFilesNFolders par
        WHERE  par.Parent NOT IN (SELECT DISTINCT Path FROM tblFilesNFolders WHERE IsActive = 0) 
            AND par.IsActive = 0)
SELECT grid.Name, grid.IsDirectory, grid.IsActive, grid.Path, grid.Parent 
    FROM tblFilesNFolders grid
    INNER JOIN parents ON grid.Parent = parents.Parent
    WHERE grid.IsActive = 0 AND grid.Path LIKE '/Home/usr1%'

我能够获取初始级别,但是当我将路径更改为/Home/usr1/New Folder/Docs%时,它不会显示2.txt文件。

我的查询应该是什么?

1 个答案:

答案 0 :(得分:1)

查询中的问题是您需要执行另一个联接。首先选择您需要显示的数据(没有层次结构的整个“已删除文件”)。然后选择不在路径中的那些父项。由于文件夹名称也在路径中,因此将该表与“父母”的第一个表连接起来以选择数据。

SELECT [ID], [Path], [Name], [Parent], [IsDirectory], [IsActive], [Size], [Owner]
INTO #temp
FROM [MFTFileExplorer].[dbo].[tblFilesNFolders]
WHERE Parent LIKE '/home/usr1%’ AND IsActive = 0;
WITH finally AS
(SELECT DISTINCT Parent
FROM #temp m1
WHERE Parent NOT IN (
SELECT Path FROM #temp WHERE Path LIKE '/%'
)
)
SELECT * FROM #temp fin
INNER JOIN finally ON finally.Parent = fin.Parent
WHERE fin.Path LIKE '/%'

请记住将“ /”放在“%”之前,因为它会将文件夹和没有IsDirectory列的文件分开。