2016-10-10 8 views
3

Я испытываю странную проблему, получая подсчет из одной таблицы. Имя таблицы Клиент и есть varchar (200) столбец с именем CardNo. Ядро базы данных Ключ Intersystems, а синтаксис запроса - SQL.Неожиданный результат из запроса COUNT

Выполняю запросы ниже, чтобы получить количество клиентов, имеющих/не имеющих 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

+0

Возможно, какой-либо другой обработки вставки/обновления/удаления при выполнении ваших запросов. –

+0

Спасибо @GordonLinoff, я проверил ситуацию с администратором db, но не было других запросов, обрабатывающих записи. – 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-движок может выбрать глобальный глобальный, а не глобальный (основной).

Вы можете восстановить индексы из портала управления или с терминала:

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

Довольно уверен, что это ответ здесь. Я видел это поведение много раз раньше. – joeb

+0

Спасибо @SSH, я твердо верю, что это может быть причиной проблемы. К сожалению, мне не разрешено запускать такой запрос из-за правительственной политики. Но я открыл билет поддержки администраторам db. Я обновляю здесь, как только получаю результаты. – Ahmet