2017-11-13 8 views
2

업데이트 : 자신을 충분히 설명하지 않았다처럼SELECT COUNT (*) 테이블 변경 후 제대로 작동하지

그건은, 다음의 예 내 원래의 질문이 게시물의 끝에, 더 일반적인 것 같다.

제 문제는 설명서에 적어도 1을 제공해야한다고 표시 될 때 count (*)가 일부 행에서 0을 제공한다는 것입니다. 다른 사용자 reported은 v9.7 및 v11.1 모두에서 발생합니다.

사람들이 내가 말하는 것을 볼 수있는 MCVE가 있습니다.

CREATE TABLE TABLE_1 
( 
    X INT NOT NULL PRIMARY KEY 
); 
CREATE TABLE TABLE_2 
( 
    Y INT NOT NULL 
); 
INSERT INTO TABLE_1 
VALUES  (1), 
      (2), 
      (3), 
      (4), 
      (5); 
INSERT INTO TABLE_2 
VALUES  (1), 
      (1), 
      (2); 

우리가 지금이 쿼리를 할 경우 :

나는이 내 테이블을 만들

SELECT T1.X, COUNT (*) as c1 
from TABLE_1 T1 left join TABLE_2 T2 on (T1.X = T2.Y) 
group by T1.X; 

그것은 각 매달려 튜플 이후 각 행에 대해 (C1)에 적어도 1 예상 결과를 제공 계산됩니다. 우리가 지금이와 테이블을 변경하고 (mao's comment에서 언급 한 바와 같이)는 RUNSTATS를 실행한다면

:

ALTER TABLE TABLE_2 
    ADD CONSTRAINT fk FOREIGN KEY (Y) REFERENCES TABLE_1 ; 
RUNSTATS ON TABLE TABLE_1; 

을 정확히 같은 쿼리를 실행, 지금은 다른 결과를 제공이 경우 동일한를 제공해야 결과 집합 :

SELECT T1.X, COUNT (*) as c1 
from TABLE_1 T1 left join TABLE_2 T2 on (T1.X = T2.Y) 
group by T1.X; 

이되면 1을 제공한다 매달려 튜플에 대한 C1 제로를 제공하고이 문제이며,이 (적어도 내 생각에), 그 COUNT (*)를 의미 작동하지 않는 설명서에 나와 있습니다.

그렇지 않은 경우 실수 한 부분을 알려주십시오.

ORIGINAL POST는 :

내가 찾아 봤는데하지만 이런 일이 왜 나도 내 교수도 이해. 다음 쿼리가 있습니다 :

SELECT A.NAME, COUNT(*) 
from SCHEMA_1.ACTORS A LEFT JOIN SCHEMA_2.MOVIES M on (M.PROTAGONIST = A.NAME) 
GROUP BY A.NAME 

여기서 NAME은 NAME을 참조하는 외래 키인 ACTORS 및 PROTAGONIST의 기본 키입니다. 또한이 두 테이블은 서로 다른 스키마에 있습니다.

이론적으로 나는 배우가 영화의 주인공 인 횟수를 얻고 싶습니다. 나는이 일을 올바른 방법이

COUNT(M.PROTAGONIST) 

사용되어야한다는 것을 알고 있지만 어떤 이유로도 카운트 (*) 더 이상 것입니다 무엇 대신 1

의 튜플을 매달려 0을주고있다

SELECT A.NAME, COUNT(*), AVG(A.AGE) 
from SCHEMA_1.ACTORS A LEFT JOIN SCHEMA_2.MOVIES M on (M.PROTAGONIST = A.NAME) 
GROUP BY A.NAME 

나이 :

SELECT A.AGE, COUNT(*) 
from SCHEMA_1.ACTORS A LEFT JOIN SCHEMA_2.MOVIES M on (M.PROTAGONIST = A.NAME) 
GROUP BY A.AGE 
나는 이것을 작성하는 경우 결과에 count (*)가 없으면 모든 것이 예상대로 작동합니다.

왜 이런 일이 발생하는지 알고 싶습니다.

+0

무엇을 의미합니까? 영화의 주인공이 아니었던 그 테이블에 배우가 없습니다. – Lamak

+0

그리고'COUNT (F.PROTAGONIST) '를 사용하면 어떻게됩니까? 너는 우리에게 이것을 결코 말하지 않았다. –

+0

@TimBiegeleisen 샘플 질의에'F' 테이블조차 없다. – Lamak

답변

1

mao's 주석 뒤에 question을 게시 한 IBM 포럼에서 count (*)의 동작이 v9.7, v10.5 및 v11.1의 버그로 확인되었습니다.

버그를 해결하려면 "특수"빌드가 필요합니다.