2011-02-04 3 views
1

원래 문은 다음과 같습니다SQL : 왜이 ​​문장에서 갑자기 2 백만 행이 늘어 났을까요?

Select 
    A.a, 
    B.b 
FROM 
    A, 
    B 
WHERE 
    A.c = B.C 

나는이를 추가하고 수 2 백만 이상의 행 :

이 테이블 CI 추가하려고
Select 
    A.a, 
    B.b, 
    C.d 
FROM 
    A, 
    B, 
    C 
WHERE 
    A.c = B.C 
    AND 
    C.c = A.c 

가 다른 두 개의 테이블이 많은만큼 단지 55,000 행입니다 더 커.

+1

테이블 정의 추가 –

+2

이전 스타일의 조인 구문을 삭제하고 마지막으로 th ANSI JOIN - INNER JOIN, LEUT OUTER JOIN 등 –

답변

5

우연히 약간의 cartesian product을 생성 한 것 같습니다. 일부 테이블에는 동일한 C 값을 갖는 여러 행이있을 가능성이 높습니다. 중복되는 경우가 있습니다. 각각의 테이블에서 C의 고유성을 살펴보십시오.

나는 명확하고 더 명시 적으로 새로운 스타일 구문 가입 사용하여 다시 것 :

SELECT A.a, B.b, C.d 
FROM A 
JOIN B on A.c = B.c 
JOIN C on A.c = C.c 
6

실제 조인을하는 대신 교차 제품이 나옵니다. 이것은 매우 비쌉니다.

나는 그것이로 재 작성 권 해드립니다 :

select a.a, b.b, c.d 
from a 
join b on a.c = b.c 
join c on c.c = a.c 

그것은 빠르고 크게 될 가능성 당신에게 당신이 찾고있는 결과를 제공 할 것입니다.

-1

흠을 ... 난 당신이 뭘 하려는지 잘 모르겠지만, 당신은 prolly 같은 것을하고 싶어 이 Cc도 BC와 일치합니다 ...

Select 
    A.a, 
    B.b, 
    C.d 
FROM 
    A, 
    B, 
    C 
WHERE 
    A.c = B.C 
    AND 
    C.c = A.c 
    AND 
    C.c = B.C 

코드가 B와 C를 개별적으로 결합하려고합니다.

1

당신이 조인 구문을 사용할 때

FROM A, B, C 

은 결과 집합 C

에서 그렇다면

행 B의 * 번호의 행 A * 번호에서

행의 제품이 될 것입니다 각 테이블에 1000 개의 행이 있습니다 결과 세트에 1,000,000,000 개의 행이 있습니다

+0

지정된 WHERE 절을 무시했습니다. Cartesian 제품은 결합에 제약이없는 경우에만 발생합니다. –

+0

true ...하지만 더 많은 행이있는 이유는 데카르트 제품 때문입니다. 왜 그런 일이 발생했는지 공유하려고했습니다 ... – Leslie

관련 문제