Sql server 2005 SQL中的计数查询
我正在使用SQL2005 表1 LinkedDocumentFolderTable包含了包含链接文档的文件夹的名称和信息 表2 LinkedDocumentTable包含有关链接文档本身的信息 这两个表由LinkedDocumentFolderID链接 我需要LinkedDocumentFolderID、描述、FolderURL和LinkedDocumentFolderTable中的IsUnmanagedFolder。我还想计算每个文件夹中链接文档的数量(由linkeddocumentfolderid标识) 下面的语句从提供LinkedDocumentTable中文档总数的角度出发,但没有按linkeddocumentfolderid进行细分。请帮助我重新编写该语句,以获得每个文件夹中linkeddocuments的计数。提前谢谢Sql server 2005 SQL中的计数查询,sql-server-2005,count,Sql Server 2005,Count,我正在使用SQL2005 表1 LinkedDocumentFolderTable包含了包含链接文档的文件夹的名称和信息 表2 LinkedDocumentTable包含有关链接文档本身的信息 这两个表由LinkedDocumentFolderID链接 我需要LinkedDocumentFolderID、描述、FolderURL和LinkedDocumentFolderTable中的IsUnmanagedFolder。我还想计算每个文件夹中链接文档的数量(由linkeddocumentfolde
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
我认为,要获得每个文件夹的文档数,您需要的是:
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;
我认为,要获得每个文件夹的文档数,您需要的是:
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;
如果我遵循正确的步骤,这应该可以完成以下工作:
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;
如果我遵循正确的步骤,这应该可以完成以下工作:
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;
这与其他人建议的相关子查询版本之间可能没有什么区别。对postgres的快速测试表明他们有不同的计划,如果可能的话,我喜欢使用不相关的查询。另一方面,如果限制要查看的文件夹,则相关查询可能需要扫描的文档表要少得多
这与其他人建议的相关子查询版本之间可能没有什么区别。对postgres的快速测试表明他们有不同的计划,如果可能的话,我喜欢使用不相关的查询。另一方面,如果限制要查看的文件夹,则相关查询可能需要扫描的文档表要少得多。在子查询中,获取每个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
在子查询中,获取每个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
在同一查询中是否需要它们?我这样问的原因是,如果你这样做了,你将为每个文档提供一个文件夹中文档数量的计数 假设您这样做了,让我们来布局您在这里得到的内容(这可能不是您所描述的,但它将是一个很好的示例): 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
在同一查询中是否需要它们?我这样问的原因是,如果你这样做了,你将为每个文档提供一个文件夹中文档数量的计数 假设您这样做了,让我们来布局您在这里得到的内容(这可能不是您所描述的,但它将是一个很好的示例): 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
为什么要使用相关子查询,只希望引擎将其转换为合理的执行计划,而不是将其作为派生表放入并知道?只有当您通过外部(或内部)查询中的WHERE子句查询一小部分行时,关联子查询才有意义。@Erik-我刚刚演示了一种实现所要求内容的相当简单的方法。如果不知道性能是否确实是一个问题,那么尝试优化它似乎没有什么意义。考虑到#1相关子查询的性能有多差#2我看到许多初学者在基于集合的概念问题上苦苦挣扎,这些问题似乎引导他们在派生表上进行相关子查询(以及在()中
在正确的联接上进行相关子查询),除非我知道相关子查询有助于提高性能,否则我不会使用相关子查询。对我来说,你的查询是一个进行过早优化的查询。@Erik-我总是很想知道其他人会如何处理问题;你为什么不留下一个答案来说明你会怎么做呢?很好。我认为提供一整套潜在的解决方案是好的,尽管当它们出现时,看到给出的警告总是好的。有关派生表的版本,请参阅from@araqnid,其中包括关于何时切换到相关子查询的有用警告……为什么要使用相关子查询,只是希望引擎将其转换为合理的执行计划,而不是将其作为派生表放入并知道?相关子查询只有在通过外部(或内部)查询中的WHERE子句查询一小部分行时才有意义。@Erik-我刚刚演示了一个f