来自COUNT查询的意外结果

时间:2016-10-10 23:12:38

标签: sql database count intersystems-cache intersystems

从一张桌子算起来时,我遇到了一个奇怪的问题。 表名为客户端,并且 varchar(200)列名为 CardNo 。 数据库引擎是 Intersystems Cache ,查询语法是SQL。

我执行下面的查询以获取具有/没有CardNo的客户端的数量。但是得到了意想不到的结果如下。

select count(*) from Client
where CardNo is null
--Result: 38000

select count(*) from Client
where CardNo is not null
--Result: 78000

select count(*) from Client
--Result: 265000

没有CardNo的客户数量是38000。 CardNo的客户端数量是78000。 表中所有客户端的数量为265000,不等于78000 + 38000.这怎么可能发生? 根据文档,我的查询风格应该没有问题 http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_null

2 个答案:

答案 0 :(得分:5)

请确保您的指数是最新的。有时人们会更改表定义并忘记构建索引,因此您最终只会在更改索引定义后插入新数据的索引。

即使您没有索引CardNo字段,也需要拥有最新的索引,因为SQL引擎可以选择通过全局索引而不是扩展(“main”)全局索引。

您可以从管理门户或终端重建索引:

do ##class(your.class.name).%BuildIndices()

答案 1 :(得分:0)

SELECT SUM( CASE WHEN CardNo IS NULL THEN 1 END ) AS Null_Count,
       SUM( CASE WHEN CardNo IS NOT NULL THEN 1 END ) AS Not_Null_Count,
       COUNT( CardNo ) AS CardNo_Count
  FROM Client;

尝试验证您的cardno计数,以确保您的查询正确执行。如果您多次运行此查询,并且如果您看到计数增加,那么应该在后台运行DML事务。