2016-10-10 107 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