2009-11-05 2 views
1

나는 이것이 무엇이라고 불리는 지 잘 모르겠다. 그러나 그것에 대해 생각해 보았고 어떻게 접근해야할지 모르겠다. 정말 간단하다고 확신합니다.SQL Join with 'Unless'절

두 개의 테이블 foo와 bar가 있습니다. 그들은 다음과 같이 관련있어 :

푸 테이블 :

| id | name 
-------------- 
| 1 | blah 
| 2 | blarg 
| 3 | blag 

바 표 (바즈의 의미는 무관하다) : 푸 당

| fooId | baz | 
--------------- 
| 1 | 100 | 
| 1 | 94 | 
| 1 | 27 | 
| 2 | 94 | 
| 3 | 19 | 

그래서, 여러 바. 위의 경우 id가 2 인 Foo를 선택하기 만합니다.

나는 시도했는데, 그들은 바즈가 94인데, 을 가지고 싶습니다.도 바스가 100이 아닙니다.

SELECT id FROM foo 
LEFT JOIN bar 
ON foo.id = bar.fooId 
WHERE bar.baz = 94 
AND bar.baz != 100 

그러나 분명히 지금까지 나를 잡았습니다. 아마도 여기에 group by 절이있을 것이라고 확신하지만, 그것이 무엇인지 분명히 모르겠습니다.

미리 감사드립니다.

EDIT :이 문제가있는 사람은 @iu이며,이 용어는 anti-join입니다.

+1

오라클의 최적화/NULL 목록만큼 의미 동일 IS NOT IN, NOT이 있는지 확인하고 LEFT가 가입 할 수있다 값은 NOT NULL로 선언됩니다. http://explainextended.com/2009/09/17/not-in-vs-not-exists-vs-left-join-is-null-oracle/ –

답변

6
select id from foo 
inner join bar b1 on b1.fooId=foo.id and b1.baz=94 
left outer join bar b2 on b2.fooId=foo.id and b2.baz=100 
where b2.fooId is null 

이 기술 용어는 "anti-join"입니다. 일반적인 내부 조인은 "동등 조인"입니다.

3
SELECT id 
FROM foo f 
JOIN bar b1 ON f.id = b1.fooId 
LEFT JOIN bar f2 ON f.id = b2.fooId AND b2.baz = 100 
WHERE b1.baz = 94 
AND b2.fooid is null 
0

이 될 수있는 일처럼 : 이 아닌 존재 (선택 foo는 존재 FROM

SELECT ID (foo.id = bar.fooId 및 bar.baz = 94 곳 모음에서 * 선택) * bar에서 foo.id = bar.fooId 및 bar.baz = 100)

2
SELECT id FROM foo 
LEFT JOIN bar 
ON foo.id = bar.fooId 
WHERE bar.baz = 94 
AND NOT EXISTS (
    SELECT bar2.fooId FROM bar bar2 
    WHERE bar2.fooId = bar.foodI AND bar2.baz = 100) 

어떻게 그렇게 할 수 있습니까?

2

당신은 당신이 원하는 결과를 얻을 수 있습니다 EXISTS와 하위 쿼리 :

SELECT id 
FROM foo 
WHERE EXISTS (SELECT fooId FROM bar WHERE fooId = foo.id AND baz = 94) 
    AND NOT EXISTS (SELECT fooId FROM bar WHERE fooId = foo.id AND baz = 100)