2009-03-13 3 views
0

감안할 때이 두 테이블 :MySQL의 서브 쿼리 질문

Foo (id, name)  -- PK = id 
Bar (fooId, value) -- PK = composite, fooId + value 
        -- value is a non-negative int 

0 위의 해당하는 Bar,value이없는 경우 어떻게 모든 Foo.name의를 찾을 수 있습니까?

Foo 
id name 
1 a 
2 b 
3 c 

Bar 
fooid value 
1  0 
1  1 
2  0 
3  4 

Result: 
b 

답변

1

나는 ... 읽기와 이해하기 쉬운 다음 찾을

SELECT foo.name 
FROM foo 
WHERE NOT EXISTS (SELECT 'x' 
        FROM bar 
        WHERE bar.fooid = foo.id 
        AND bar.value > 0) 
1
SELECT name FROM FOO WHERE id NOT IN(
    SELECT fooId FROM Bar GROUP BY fooId HAVING MAX(Value) > 0) 
2
SELECT Name 
FROM Bar 
INNER JOIN Foo ON Foo.Id = Bar.fooId 
GROUP BY fooId, name 
HAVING SUM(Value) = 0 

이 쿼리 및 zodeus에 의해 게시 한 실행 시간의 같은 길이에 대해 가지고는, 그러나이 일이 참조되지 않은 푸 기록을 포함하지 않습니다 : 예

바 (bar) 테이블. 예를 들어 Foo (4, d)라는 레코드가있는 경우이 쿼리는 여전히 'b'를 반환합니다. 여기서 zodeus의 쿼리는 'b'와 'd'를 반환합니다.

0
select Foo.name 
from Foo 
where Foo.id not in 
(select Bar.fooid from Bar 
where value > 0)