2009-04-17 4 views
0

Я использую SQL 2005.Число запросов в SQL

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

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

Эти две таблицы связаны LinkedDocumentFolderID.

Мне нужен LinkedDocumentFolderID, описание, 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  

ответ

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

Работы БОЛЬШИЕ! Благодарю. –

+0

Почему вы используете коррелированный подзапрос, просто * надеясь *, что движок преобразует его в разумный план выполнения, вместо того, чтобы помещать его в производную таблицу и знать? Коррелированный подзапрос имеет смысл только в том случае, если вы запрашиваете небольшой набор строк через предложение WHERE во внешнем (или внутреннем) запросе. – ErikE

+0

@ Erik - Я просто проиллюстрировал довольно простой способ добиться того, что было задано. Не зная, является ли производительность на самом деле проблемой, нет смысла пытаться ее оптимизировать. –

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 
Смежные вопросы