2016-10-10 9 views
3

한 테이블에서 계산하는 동안 이상한 문제가 발생했습니다. 테이블 이름은 클라이언트이고 이라는 이름의 varchar (200) 카 드가 있습니다. 카드 번호입니다. 데이터베이스 엔진이 인 경우 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없이 고객의 수는 CardNo와 클라이언트의 수는 테이블에있는 모든 클라이언트의 수는 동일하지 38000. + 78000을 어떻게 할 수이 인 265,000입니다 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

Thanks @Teja, 여러 번 쿼리를 실행했지만 결과는 항상 같습니다. 새 클라이언트로 인해 예상되는 매일 새로운 레코드가 몇 개 있습니다. – Ahmet

5

색인이 최신인지 확인하십시오. 때로 사람들은 테이블 정의를 변경하고 인덱스 작성을 잊어 버리기 때문에 인덱스 정의를 변경 한 후 삽입 한 새 데이터에 대한 인덱스로 끝납니다.

SQL 엔진이 전역 ("주") 확장 대신 인덱스 전역을 통과하도록 선택할 수 있으므로 CardNo 필드를 인덱싱하지 않아도 최신 인덱스가 있어야합니다.

당신은, 또는 터미널에서 관리 포털에서 인덱스를 재 구축 할 수 있습니다 : 아마도 다른 처리/업데이트/삭제를 삽입됩니다

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

확실히 여기가 답입니다. 나는이 행동을 여러 번 전에 보았습니다. – joeb

+0

감사합니다. @SSH, 나는 이것이 문제의 원인이 될 수 있다고 강력히 믿습니다. 불행히도 정부 정책으로 인해 이러한 쿼리를 실행할 수 없습니다. 하지만 DB 관리자에게 지원 티켓을 열었습니다. 나는 결과를 얻 자마자 여기에서 업데이트 할 것이다. – Ahmet