我正在创建一个用于文档管理的基于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文件。
我的查询应该是什么?
答案 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列的文件分开。