sql count查询超过count查询

时间:2019-01-16 22:14:06

标签: sql-server

以下是我的查询以获取documentid的计数

select count(did),did 
from ( 
      select count(FileDataId) as fid, 
             documentid as did,
             FileDataId 
      from DocumentHistory 
      where documentid in (
                           select documentid 
                           from Document 
                           where DocumentTypeId=11 and 
                                 IsVerified=0 and 
                                 lastmodified < '5/jan/2019' 
                          ) 
      group by DocumentId,
               filedataid 
      having count(FileDataId)<2
      )

我收到错误消息

  

')'附近的语法不正确。

如果我运行内部查询,它将为我带来结果

enter image description here

我想知道结果重复了多少次

1 个答案:

答案 0 :(得分:4)

我猜是因为您没有为子查询添加别名。您还缺少外部查询中的分组。您查询的格式也可以改善:

select 
  count(a.did),
  a.did  
from ( 
  select 
    count(dh.FileDataId) as fid, 
    dh.documentid as did,
    dh.FileDataId 
  from DocumentHistory dh 
  INNER JOIN Document d on d.documentid = dh.documentid
  where d.DocumentTypeId=11 and d.IsVerified=0 and d.lastmodified < '2019-01-05'  
  group by DocumentId, filedataid 
  having count(FileDataId)<2
) a
GROUP BY did

以及结合西蒙的建议 围绕日期格式(yyyy-mm-dd是ISO,并且不受诸如包含单词的日期之类的本地化问题的影响-您的查询可能不适用于例如西班牙数据库),我也将IN换成了INNER JOIN;尽管查询优化器通常可以将IN重写为类似于联接的行为,但您应避免将IN用于列表的时间长于您准备手工编写的时间。某些数据库在连接方面比在

中进行了更好的优化。

请注意,INNER JOIN和IN之间的行为略有不同,如果IN(...)列表包含重复项,则不会从文档历史记录结果中得到重复的行,但是您会得到一个内部联接。 (我希望documentid是文档的主键,因此在这种情况下不会出现重复)