2012-07-02 2 views
1

저는 약간 새로운 SQL을 사용하므로 나와 함께 있습니다.Hive SQL - Null 값을 무시하도록 JOIN 쿼리를 수정하십시오.

두 개의 테이블이 있습니다. 각 테이블에는 ID 열이 있습니다. 표 A에는 역할이라는 제목의 열이 있으며 표 B에는 결과라는 제목의 열이 있습니다. 이 테이블을 쿼리하여 ID를 기반으로하는 행이 'PS'이고 결과가 'DE'인 행을 찾으려고합니다.

SELECT count(*) 
FROM A JOIN B 
ON (A.id = B.id 
AND A.role = 'PS' 
AND B.outcome = 'DE') 

가 나는 그것이 A.role 또는 B.outcome 중 하나는 null 값이 행을 포함하지 않도록 할 수있는 방법에 대해 인터넷을 검색했습니다 : 여기 내 코드입니다.

B.outcome = 'DE'인 항목의 총 수가 40,000인데도 위 코드 결과는 40,100이라고 말할 수 있습니다. 따라서 그것은 분명히 내 조건에 맞지 않는 항목을 포함합니다. 더 나은 쿼리를 개선 할 수있는 방법이 있습니까?

+0

또한 IS NOT NULL 조건을 추가하려고 시도했지만 출력을 변경하지 않았습니다. – t3hclwn

+0

거기에 없어야하는 여분의 행을 확인 했습니까? 그들은 무엇을 포함합니까? – biziclop

+0

그들은 모두 A.role = 'PS'와'B.outcome = 'DE'' 둘 다 가지고있는 나의 설명에 맞는 것 같다. – t3hclwn

답변

0

검색어에 null 값이있는 행이 이미 A.role에 제외되어 있습니다. 결국 null = 'PS'이 참이 아니며 내부 조인을 사용하고 있습니다.

당신이 B에이보다 참여에서 더 많은 행을 검색 할 수있는 방법을 쉽게 설명이 당신이이 A의 행이 있다고 가정입니다 :

A.id A.role 
1  'A' 
1  'A' 

그리고 B에 대한 이러한 행 :

B.id B.outcome 
1  'A' 
1  'A' 

그런 다음이 쿼리

select * 
from A 
join B 
on  A.id = B.id and A.role = 'A' and B.role = 'A' 

4 개 행을 반환합니다. 그것은 테이블 A 또는 B보다 많습니다!

그래서 id 고유 여부를 조사 할 것 :

select count(*) from A group by id having count(*) > 1 
select count(*) from B group by id having count(*) > 1 

이러한 쿼리가 0보다 수가 더 돌아 가면 id은 고유하지 않습니다. 조인은 매치마다 행을 반복하므로 반환되는 레코드의 양이 크게 증가합니다.

+0

도움을 주신 Andomar에게 감사드립니다! 나는 지금 나는 이해한다고 생각한다. 나는 당신의 테스트 코드를 실행했고 그것은'id '가 유일하지 않다는 것을 보여준다. 고유 한 레코드를 얻을 수있는 방법이 있습니까? 즉, 중복 된 ID를 건너 뛰는 계산식을 얻을 수 있습니까? – t3hclwn

+1

고유 카운트를 위해서'A에서 count (distinct id)를 선택하십시오. ' – Andomar

+0

고마워요! 그것은 나에게 더 많은 의미를 부여했다. – t3hclwn