0

SQL 2005 を使用しています。

表 1 の LinkedDocumentFolderTable には、リンクされたドキュメントを保持するフォルダーの名前と情報が含まれています。

表 2 の LinkedDocumentTable には、リンクされたドキュメント自体に関する情報が含まれています。

2 つのテーブルは、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

サブクエリで、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 

ここで、フォルダー Information も必要なので、それを結合する必要があります。

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 に答える
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 に答える