【问题标题】:sql count query over a count querysql计数查询超过计数查询
【发布时间】:2019-01-16 22:14:05
【问题描述】:

以下是我获取 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
      )

我收到错误

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

如果我运行内部查询,它会给我带来结果

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

【问题讨论】:

  • 空白让您的查询更容易阅读。而且,一旦你使用它,你会注意到你没有在你的FROM 中给你的子查询一个别名;这是强制性的。试试SELECT * FROM (SELECT 1 as i);,你会得到同样的错误。
  • 子查询加个别名就行了,group by也需要
  • 现在已将其格式化为清晰易读的格式,问题所在就很清楚了。您将子查询作为查询的来源,但它没有别名。但老实说,这里似乎有些不对劲。因为您已在子查询中将它们分组,所以每行的确实计数为 1。
  • 另外,对于 ANSI 标准 lastmodified &lt; '5/jan/2019',这是不好的做法

标签: sql-server


【解决方案1】:

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

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

除了采纳 simon 的建议 围绕日期格式(yyyy-mm-dd 是 ISO,并且不受本地化问题的影响,例如包含单词的日期 - 您的查询可能不适用于例如西班牙语数据库),我也将 IN 换成了 INNER JOIN;尽管查询优化器通常可以重写 IN 以使其表现得像一个连接,但您应该避免将 IN 用于比您准备手动编写的列表更长的列表。有些数据库比 in 更适合 join 优化

注意,话虽如此,INNER JOIN 和 IN 之间的行为略有不同,如果 IN(...) 列表包含重复项,您将不会从 documenthistory 结果中获得重复的行,但您会使用内部联接。 (我希望 documentid 是文档的主键,因此在这种情况下不会出现重复项)

【讨论】:

  • GROUP BY did ,因为有select count(did),did
  • 这个解决方案有效。,从来没有想过缺少别名是问题,谢谢
  • 总是为所有子查询设置别名,实际上最好也完全限定所有列名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多