2009-04-17 96 views
0

我正在使用SQL 2005.在SQL中计数查询

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

表2 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  

回答

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; 
+0

工程伟大!谢谢。 – 2009-04-17 18:34:35

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; 
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的快速测试显示他们有不同的计划,如果可能的话,我喜欢去找不相关的查询。另一方面,如果您限制了您正在查看的文件夹,则相关的查询可能涉及扫描文档表的很少部分。

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 
0

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

假设你做什么,让我们的布局,你在这里得到了什么(这可能不是你描述的到底是什么,但它会成为一个很好的例子):

LinkedDocumentFolder - ID, FOLDERNAME

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