0

我正在使用 SQL 2005。

表一 LinkedDocumentFolderTable 包含有关保存链接文档的文件夹的名称和信息。

表二,LinkedDocumentTable,包含有关链接文档本身的信息。

这两个表由 LinkedDocumentFolderID 链接。

我需要 LinkedDocumentFolderTable 中的 LinkedDocumentFolderID、Description、FolderURL 和 IsUnmanagedFolder。我还想计算每个文件夹中链接文档的数量(由linkeddocumentfolderid标识)。

下面的语句从为我提供 LinkedDocumentTable 中的文档总数的角度工作,但没有通过linkeddocumentfolderid 将其分解。请帮我重新编写语句以计算每个文件夹中链接文档的数量。提前致谢。

select Count(*)
from linkeddocumenttable
    select ld.linkeddocumentfolderid,ld.description,
    ld.folderURL,ld.isunmanagedfolder
    from linkeddocumentfoldertable ld
        inner join linkeddocumenttable l on
        ld.linkeddocumentfolderid=l.linkeddocumentfolderid      
4

5 回答 5

3
select LinkedDocumentFolderTable.LinkedDocumentFolderID, Description,
    FolderURL, IsUnmanagedFolder, DocumentCount
from LinkedDocumentFolderTable
join (select count(*) as DocumentCount, LinkedDocumentFolderID
    from LinkedDocumentTable
    group by LinkedDocumentFolderID) stats
on LinkedDocumentFolderTable.LinkedDocumentFolderID = stats.LinkedDocumentFolderID

这与其他人建议的相关子查询版本之间可能几乎没有区别。对 postgres 的快速测试表明他们确实有不同的计划,如果可能的话,我喜欢进行不相关的查询。另一方面,如果您要限制正在查看的文件夹,则相关查询可能涉及扫描的文档表要少得多。

于 2009-04-17T18:27:55.757 回答
1

我认为您正在寻找获取每个文件夹的文档数的内容类似于:

SELECT
    LinkedDocumentFolderID
    ,COUNT(*) AS DocumentCount
FROM
    LinkedDocumentTable
GROUP BY
    LinkedDocumentFolderID;

如果您实际上试图将其作为单个语句获取,那么您可以使用相关的子查询,例如

SELECT 
    ld.LinkedDocumentFolderID
    ,ld.Description
    ,ld.FolderURL,
    ,ld.IsUnmanagedFolder
    ,DocumentCount =
         (SELECT COUNT(*) 
          FROM LinkedDocumentTable l
          WHERE l.LinkedDocumentFolderID = ld.LinkedDocumentFolderID)
FROM
    LinkedDocumentFolderTable ld;
于 2009-04-17T18:25:39.350 回答
0

如果我遵循正确,这应该可以完成工作:

SELECT
    f.LinkedDocumentFolderID,
    f.Description,
    f.FolderURL,
    f.IsUnmanagedFolder,
    (SELECT COUNT(*)
    FROM LinkedDocumentTable d
    WHERE d.LinkedDocumentFolderID = f.LinkedDocumentFolderID) NumDocuments
FROM LinkedDocumentFolderTable f
ORDER BY f.LinkedDocumentFolderID;
于 2009-04-17T18:26:28.803 回答
0

在子查询中,获取每个 LinkedDocumentFolderID 有多少文档的计数,然后将它们加入到您想要的其余信息中。

SELECT LinkedDocumentFolderID, Description, FolderURL, IsUnmanagedFolder, Num_Docs
FROM LinkedDocumentFolderTable, (
    SELECT LinkedDocumentFolderID, COUNT(*) AS Num_Docs
    FROM LinkedDocumentFolderTable folders, LinkedDocumentTable docs 
    WHERE folders.LinkedDocumentFolderID=docs.LinkedDocumentFolderID
    GROUP BY LinkedDocumentFolderID
) AS DocsPerFolder
WHERE DocsPerFolder.LinkedDocumentFolderID=LinkedDocumentFolderTable.LinkedDocumentFolderID
于 2009-04-17T18:29:08.080 回答
0

您需要它们在同一个查询中吗?我问的原因是,如果您这样做,您将为每个文档提供文件夹中文档数量的计数。

假设你这样做了,让我们来布置你在这里得到的东西(这可能不是你所描述的,但它会成为一个很好的例子):

LinkedDocumentFolder -- ID、文件夹名称

LinkedDocument -- ID、LinkedDocumentFolderID、描述

首先,您需要的是一份文件清单,当然是:

SELECT * FROM LinkedDocument 

现在,由于您还需要文件夹信息,因此您需要将其加入:

SELECT ldf.FolderName, ld.*
FROM LinkedDocument ld
INNER JOIN LinkedDocumentFolder ldf ON ldf.ID = ld.LinkedDocumentFolderID 

现在,有趣的部分。由于我们的假设是您希望返回数据集的每条记录都包含文档列表,因此您现在需要的是在该特定列表中包含一个计数。您想要的是添加另一个联接,该联接仅适用于计数:

SELECT ldf.FolderName, ld.*
FROM
   LinkedDocument ld
   INNER JOIN LinkedDocumentFolder ldf ON ldf.ID = ld.LinkedDocumentFolderID 
   INNER JOIN (
      SELECT LinkedDocumentFolderID, COUNT(ID) AS DocCount
      FROM LinkedDocument
      GROUP BY LinkedDocumentFolderID
   ) AS CNT ON cnt.LinkedDocumentFolderID = ldf.ID
于 2009-04-17T18:30:33.910 回答