需要针对文档管理系统的优化查询或存储过程

时间:2013-11-18 10:22:44

标签: sql sql-server tsql

我正在开发一些文档管理系统,需要为用户提供文档共享功能。我有两个表,一个包含上传文件的信息(比如表1),另一个表包含与用户共享文件的信息(比如表2)。

请参阅下图: enter image description here

现在我需要根据用户共享显示文档列表。 W.r.t到上表,因为表1中的'Folder 3'是'Folder 2'的子项,它是'Folder 1'的子项。

现在只有“文件夹3”与用户“1234”共享(参见表2),当文档列表首先显示时,默认情况下将显示父母,在我们的案例中为“文件夹1”。< / p>

在我的要求中,我只需要显示父母要显示子文件夹的导航,因为文件夹1有一个孩子'文档1'而文件夹2有一个孩子'文档2'。

但是当我打开用户'1234'时,我需要显示的是:

  1. 第一页'文件夹1'。
  2. 点击“文件夹1”只显示“文件夹2”,而不显示“文档1”,因为只有“文件夹3”与“文件夹2”下的用户共享。
  3. 现在点击'文件夹2'只显示'文件夹3',而不是'文档2',因为只有'文件夹3'与用户共享。
  4. 现在最后当我们点击'文件夹3'时,我们将显示所有文档和文件夹位于“文件夹3”下,因为父级与用户共享。
  5. 我希望我能够解释我的问题。我需要您的帮助来准备一些查询或存储过程以有效地获取所需的数据。我使用MSSQL Server 2008作为数据库。

    提前谢谢你。

1 个答案:

答案 0 :(得分:0)

通过您的评论,您正在寻找一种方法来从用户拥有权限的任何子项以及下面的所有内容中遍历您的文件夹结构。那么也许你正在寻找一个递归查询?

记录用户拥有+上面所有内容的权利:

WITH Child(id, name, parentId) AS 
(
    SELECT id, name, parentId 
    FROM Table1
    WHERE EXISTS ( SELECT * 
                   FROM Table2 
                   WHERE Table1.Id = Table2.ShareDocId
                   AND   Table2.UserId = :userId )
    UNION ALL
    SELECT Child.id, Child.name, Child.parentId
    FROM Table1 as Parent, Child
    WHERE Child.parentId = Parent.id
)
SELECT *
FROM Child

记录用户拥有以下所有内容的权利:

WITH Parent(id, name, parentId) AS 
(
    SELECT id, name, parentId 
    FROM Table1
    WHERE EXISTS ( SELECT * 
                   FROM Table2 
                   WHERE Table1.Id = Table2.ShareDocId
                   AND   Table2.UserId = :userId )
    UNION ALL
    SELECT Parent.id, Parent.name, Parent.parentId
    FROM Table1 as Child, Parent
    WHERE Child.parentId = Parent.id
)
SELECT *
FROM Child

注意:您几乎肯定会获得重复记录(例如,如果有人对同一父母的多个孩子拥有权利)。可能需要调整并且可能需要DISTINCT。