2012-02-15 6 views
0

'status'라는 필드와 관련된 두 개의 테이블이 있습니다. table2.location의 값이 'texas'인 경우 table2.status의 인스턴스가 'good'인 20 개의 인스턴스가 있습니다.SQL LEFT JOIN 및 예상치 못한 결과가 발생합니다.

즉, 다음 쿼리는 table2.status = 'good'의 20 행을 반환합니다.

[A] SELECT table2.status FROM table2 WHERE table2.location = 'texas'; 

또한 고유 한 table1.id에는 table1.status = 'good'이 있습니다.

즉, 다음 쿼리는 50 개의 고유 한 table1.id 행을 반환합니다. 이제

[B] SELECT table1.id FROM table1 WHERE table1.status = 'good'; 

, 나는 다음과 같은 쿼리를 실행할 때 :

[C] SELECT table1.id FROM table1 LEFT JOIN table2 ON table1.status = table2.status WHERE table2.location = "texas"; 

나는 고유 ID 년대의 50 개 행을 반환 할 것으로 예상합니다. 그러나 실제로 고유 한 ID 20 번 50 행을 반환합니다 (즉, 반환 된 1000 행을 가져옵니다).

간단히 말해서 SELECT DISTINCT table1.id ...를 실행하면 50 행 (50 행 20 세트가 아닌)의 집합이 반환됩니다.

그러나 나는 왜 내가이 행동을보고 있는지 알고 싶습니다. 내 질문 [C]에 문제가있을 수 있습니다.

감사합니다.

답변

1

귀하의 질의는 두 가지 문제

있다
SELECT table1.id 
FROM table1 
LEFT JOIN table2 ON table1.status = table2.status 
WHERE table2.location = "texas"; 

먼저 때 usae 왼쪽 두 번째 테이블의 조인 조건은 where 절이 아닌 ON 절에 있거나 왼쪽 조인을 내부 조인으로 변환해야합니다 (조건을 충족해야 함).

SELECT table1.id 
FROM table1 
LEFT JOIN table2 
    ON table1.status = table2.status 
    AND table2.location = "texas"; 

이제 당신의 다음 문제는 당신이 실제로 가입하고 싶어하는 것 같지 않다는 것입니다. 원하는 결과를 얻을 수 있도록 두 테이블의 테이블 구조를 확인해야합니다.

2

50 개의 항목을 얻으려면 쿼리가 잘못되었습니다. 50x20의 크로스 조인을 수행하므로 1000 개의 레코드가 결과로 나타납니다.
상태에 참여할 수 없습니다 (고유하지 않음) : 아마도 테이블 디자인이 잘못되었을 수 있습니다.
IMO 두 테이블 모두에 ID가 있어야하며이 테이블에 가입해야합니다 ...

2

예상됩니다. 표 1에서 1 행 1 경기 다시 테이블에서 테이블 2, 2 행에서 50 개 행을 일치 등 표 2에서와 동일한 50 행

관련 문제