Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQL中的计数查询_Sql Server 2005_Count - Fatal编程技术网

Sql server 2005 SQL中的计数查询

Sql server 2005 SQL中的计数查询,sql-server-2005,count,Sql Server 2005,Count,我正在使用SQL2005 表1 LinkedDocumentFolderTable包含了包含链接文档的文件夹的名称和信息 表2 LinkedDocumentTable包含有关链接文档本身的信息 这两个表由LinkedDocumentFolderID链接 我需要LinkedDocumentFolderID、描述、FolderURL和LinkedDocumentFolderTable中的IsUnmanagedFolder。我还想计算每个文件夹中链接文档的数量(由linkeddocumentfolde

我正在使用SQL2005

表1 LinkedDocumentFolderTable包含了包含链接文档的文件夹的名称和信息

表2 LinkedDocumentTable包含有关链接文档本身的信息

这两个表由LinkedDocumentFolderID链接

我需要LinkedDocumentFolderID、描述、FolderURL和LinkedDocumentFolderTable中的IsUnmanagedFolder。我还想计算每个文件夹中链接文档的数量(由linkeddocumentfolderid标识)

下面的语句从提供LinkedDocumentTable中文档总数的角度出发,但没有按linkeddocumentfolderid进行细分。请帮助我重新编写该语句,以获得每个文件夹中linkeddocuments的计数。提前谢谢

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