3

我在从一张桌子上计数时遇到了一个奇怪的问题。表名是Client并且有一个名为CardNo的varchar(200)列。数据库引擎是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

4

2 回答 2

5

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

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

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

do ##class(your.class.name).%BuildIndices()
于 2016-10-11T00:35:22.680 回答
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 事务在后台运行。

于 2016-10-11T00:07:01.443 回答