2010-06-08 2 views
0

나는 아주 간단한 쿼리를 작성하려고합니다.두 테이블의 데이터를 조인하려고하면 행이 사라짐

나는 다음과 같은 쿼리를 실행하는 경우 : 내가 기대하는 모든 행이 반환 될 얻을

SELECT parts.id, parts.type_id 
FROM parts 
WHERE parts.type_id=1 
    OR parts.type_id=2 
    OR parts.type_id=4 
ORDER BY parts.type_id; 

합니다. 지금은 여섯 개 행이 갑자기 결과를 중퇴 다음 쿼리를 다른 테이블에서 parent_unit를 잡아하려고하면

SELECT parts.id, parts.type_id, sp.parent_unit 
FROM parts, serialized_parts sp 
WHERE (parts.type_id=1 OR parts.type_id=2 OR parts.type_id=4) 
    AND sp.parts_id = parts.id 
ORDER BY parts.type_id 

정말 어쩌면 난 내 쿼리에서 관찰 보고서 취급 적이 과거에 그냥 잘못하고있어. 그건 내가 생각하기에는 단순한 실수 일 뿐이라고. 샘플 데이터가 필요하면 알려주고 일부는 게시하겠습니다. 감사.

+2

명시 적 조인을 사용하는 방법을 배우십시오. – HLGEM

+0

HLGEM의 의견을 뒷받침하는 내용은 다음을 참조하십시오. http://stackoverflow.com/questions/2241991/in-mysql-queries-why-use-join-instead-of-where –

답변

0

누락 행 6 개에 대한 parts.parts_id 값을 확인하십시오. 아마도 sp.parts_id에 해당 값이 없을 것입니다 (또는 parts.parts_id 값이 null 일 수도 있습니다). 조인이 작동하려면 정확히 일치해야합니다.

OR 문자열 대신 part.type_id IN (1,2,4)을 사용할 수 있습니다. 나열된 OR과 동일하게 작동하지만 읽기 쉽습니다.

5

조인없이 행 수가 동일한 지 확인하려면 왼쪽 외부 조인을 사용하십시오. 예를 들어

http://dev.mysql.com/doc/refman/5.0/en/join.html

:

SELECT parts.id, parts.type_id, sp.parent_unit 
FROM parts 
LEFT JOIN serialized_parts sp 
ON sp.parts_id = parts.id 
WHERE (parts.type_id=1 OR parts.type_id=2 OR parts.type_id=4) 
ORDER BY parts.type_id 

가입의 기본 유형은 내부 이다는 가입 할 수 있습니다. 내부 조인에서 테이블 A와 테이블 B의 조인 된 필드가 일치하지 않으면 테이블 A와 테이블 B의 내용이 모두 표시되지 않습니다. 가장 가능성있는 시나리오는 부품 표의 여섯 개의 행에 대해 부품 열의 id과 일치하는 parts_id을 갖는 serilized_parts 행이없는 것입니다. 이 경우 왼쪽 외부 조인을 수행하면 serialized_parts 행이없는 행이 일치하여 sp.parent_unitNULL으로 표시합니다.

+1

내 추측이 될 것입니다. 테이블에는 모든 레코드 inteh 첫 번째 테이블까지 일치하는 레코드가 없습니다. – HLGEM

0

이 시도 :

SELECT parts.id, parts.type_id, sp.parent_unit 
FROM parts 
LEFT JOIN serialized_parts sp ON sp.parts_id = parts.id 
WHERE parts.type_id IN (1,2,4) 
ORDER BY parts.type_id 

을 읽고 이해하고 긴 형태가 분명히 조인 절에 사용되는 뭐죠하고있는 뭐죠하게하는 조인을 사용하는 간단 IN 절,와 OR의 제거 어디에서 사용 되는가?

0

내가 개발 환경에서 작업 할 때보 다 데이터베이스를 좀 일찍 테스트 할 때 데이터베이스가 엉망이었고 행이 누락되었습니다.

관련 문제