2009-04-17 98 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