Подсчет запросов в SQL - PullRequest
0 голосов
/ 17 апреля 2009

Я использую SQL 2005.

Таблица 1, LinkedDocumentFolderTable, содержит имена и информацию о папках, в которых хранятся связанные документы.

Таблица 2, LinkedDocumentTable, содержит информацию о самих связанных документах.

Две таблицы связаны между собой LinkedDocumentFolderID.

Мне нужны LinkedDocumentFolderID, Description, FolderURL и IsUnmanagedFolder из таблицы LinkedDocumentFolderTable. Я также хотел бы получить счетчик количества связанных документов в каждой папке (идентифицируемых с помощью связанный документ документов).

Вышеприведенное утверждение работает с точки зрения предоставления мне общего количества документов в LinkedDocumentTable, но не разбивает его на связанный документ документа. Пожалуйста, помогите мне переписать заявление, чтобы получить количество связанных документов в каждой папке. Заранее спасибо.

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      

Ответы [ 5 ]

3 голосов
/ 17 апреля 2009
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 показывает, что у них разные планы, и я хотел бы пойти на некоррелированные запросы, если это возможно. С другой стороны, если вы ограничиваете, какие папки вы просматриваете, коррелированный запрос может включать сканирование намного меньшего количества таблицы документов.

1 голос
/ 17 апреля 2009

Я думаю, что то, что вы ищете, чтобы получить количество документов на папку, выглядит примерно так:

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 голосов
/ 17 апреля 2009

Нужны ли они в одном запросе? Причина, по которой я спрашиваю, заключается в том, что если вы это сделаете, вы предоставляете счетчик количества документов в папке для каждого документа.

Предполагая, что вы это сделаете, давайте разберем то, что у вас есть (это может быть не совсем то, что вы описали, но это будет хороший пример):

LinkedDocumentFolder - идентификатор, имя папки

LinkedDocument - идентификатор, 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
0 голосов
/ 17 апреля 2009

В подзапросе получите количество документов для каждого 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 голосов
/ 17 апреля 2009

Если я правильно следую, это должно сделать работу:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...