2012-08-15 2 views
2

다음 열이 포함 된 테이블이 있습니다. a, b, e와 다른 테이블 인 table2는 c, d를 포함합니다. 두 테이블의 열은 name입니다. 내부 조인을 사용할 때 다른 결과가 나타나는 이유

나는 쿼리를 만든 :

SELECT distinct a, b 
from db.table 
where e <>'65'; 

을 그리고 1885 개 기록

그럼, 좀 더 다른 테이블의 정보 (C, D)에 필요한 말을 얻었다. 이러한 추가 정보를 얻기 위해 내부 조인을 사용했습니다. 쿼리는 다음과 같이됩니다.

SELECT distinct a, b, c, d 
from db.table 
inner join db.table2 
on table.name=table2.name2 
where e <>'65'; 

이제는 동일한 결과를 기대했지만 추가 열 (c, d)이 있습니다. 그러나 나는 다른 수의 결과를 얻었습니다 : 51144. 더 많은 열을 추가하고 조건을 변경하지 않은 동안 왜 숫자가 증가했는지 설명 할 수 있습니까?

답변

0

DISTINCT는 키워드가 말한대로 반환하며, select와는 다른 결과를 나타냅니다.

고유 선택에 추가 열을 추가한다는 사실 때문에 고유 결과 세트가 더 많은 행이 될 수 있습니다.

가 발생합니다

A B C 
1 2 1 
1 3 2 
1 2 3 

가정 해 봅시다,

A B 
1 2 
1 3 

을 것

A B 
1 2 
1 3 
1 2 

에서

고유의 예를 살펴 가지고 있지만 지금에 추가 열을 추가 할 수 있습니다

A B C 
1 2 1 
1 3 2 
1 2 3 

내부 조인은 결과 집합을 제한 할 수 있습니다. 내부 조인은 table1과 table2에있는 값만 반환하므로 table1에 특정 값이 있지만 table2에는 반환되지 않습니다. .

또는 @zerkms에 의해 언급 된 것처럼, 2 개의 테이블 간의 관계를 정의하는 2 개의 키가 있다면 예상 한 것보다 더 많이 얻을 수 있습니다.

+0

'DISTINCT' 악한 운영자가 척으로 :-) 대신입니다 아무 문제 없다 - 그냥 쓸 항상 ** 올바른이 ** 직교 제품 – zerkms

+0

@zerkms을 반환하지 않는 쿼리가 완전히 aggreed 더있다, 그러나 당신 1-many 조인을 알고 있습니다. 이것은 데카르트 제품/교차 조인이 아닙니다. –

+0

1 : N 엔티티 쿼리를 수행 할 때 결과 집합 행 수가 원래 1 엔티티 쿼리와 동일 할 것으로 예상하지 않습니다 .-) – zerkms

1

이것은 실제로는 cartesian product이라고하며 실제적으로는 ON 조인 조건에 대해보다 정확하게 설명해야합니다. table2 표 하나 소정의 동일한 값과 일치하는 경우에만 그 결과를 반환한다 table 테이블

1

INNER 가입에서 각 행마다 조건 table.name=table2.name2 일치하는 하나의 레코드를 포함하는 경우

동일한 결과 만 가능한 것 두 테이블의 열 (ON 조건에서 사용).

0

놀랍습니다. select 문과 다른 테이블에 추가 된 열이 2 개 더 있습니다. 당신이 먼저 문있어 테이블이

A B C D E 
1 2 1 1 
1 2 3 4 
1 2 4 5 
1 2 4 5 

같다 경우

를 반복하지 4 열 (A, B, C, D)에 적용됩니다 별개의 예를 들어

A, B는 뚜렷한 1,2를 선택합니다. 두 번째 문장은 조건 e를 충족하는 한 1,2,1,1 - 1,2,3,4 - 1,2,4,5를 선택합니다. <> 65

나머지는 귀하의 선택과 관련하여 구체적으로.

0

DISTINCT 키워드 이 전체 행에 적용됩니다.

a  b  c   d 
===================================== 
1  1  1   1 
1  1  3   2 
1  1  4   2 
1  2  5   2 
1  2  6   6 
1  3  1   1 

당신이 DISTINCT a, b을 적용하는 경우

, 그것은 결과를해야합니다 :

는이 결과를 말해 기록의 두 1, 1의 중복을했다

a  b  
============== 
1  1    
1  2  
1  3  

때문이다. DISTINCT a, b, c ,d라고 말하면 모든 레코드를 반환합니다.

쿼리가 여러 레코드를 반환하는 또 다른 이유 중 하나는 tableA 레코드가 tableB 레코드에서 일치하는 레코드가 많을 수 있기 때문입니다. tableA에 레코드가 1 개 있지만 tableB에 해당 레코드가 5 개의 레코드와 일치한다고 가정 해 보겠습니다. tableA에서 1 레코드 대신 테이블을 조인하려고하면 일치 때문에 5 rows을 반환해야합니다.

+0

distinct (a)의 의미를 전달하기 위해 쿼리를 편집하려면 어떻게해야합니까 ?? b, c, d는 결과에 a에 대한 세부 정보를 표시하기 만하면됩니다. 뚜렷하게 구분할 필요가있는 유일한 가치는 다음과 같습니다. –

+0

하위 쿼리로 바꿀 수 있습니다 : D –

+0

예. –

관련 문제