2016-10-10 154 views
3

从一个表中获取计数时,我遇到了一个奇怪的问题。 表名是客户端并且有一个varchar(200)列名为卡号。 数据库引擎是Intersystems缓存并且查询语法是SQL。来自COUNT查询的意外结果

我在下面执行查询以获得有/没有卡号的客户的数量。但获得意想不到的结果如下。

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

+0

也许一些其他处理插入/更新/删除当您运行的查询。 –

+0

谢谢@GordonLinoff,我已经检查了数据库管理员的情况,但没有其他查询处理记录。 – Ahmet

回答

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事务。

+0

谢谢@Teja,我已经多次运行查询,但结果始终是相同的。由于新客户的需求,每天只有少量新记录会增加。 – Ahmet

5

请确保您的索引是最新的。有时人们改变表格定义并忘记建立索引,所以你最终只能在索引定义改变后插入新数据的索引。

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

您可以重建从管理门户指数,还是从终端:

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

很确定这是这里的答案。我以前曾经见过这种行为。 – joeb

+0

谢谢@SSH,我坚信这可能是问题的原因。不幸的是,由于政府政策,我不被允许执行此类查询。但是我已经打开了对数据库管理员的支持票证。我会在获得结果后立即更新。 – Ahmet