2014-09-04 6 views
0

확인. 그래서이 쿼리를 작성하면서 테이블 구조로 인해 작성한 다른 쿼리와 다르다는 것을 알았습니다. 내가 모으려고하는 세 개의 테이블 중 두 개가 에 대한 참조를 가지고 있고 나머지 중, 중 하나가 해당 참조 중 nullable입니다. 내 쿼리에서 서로 참조를 연결하는 테이블

Table A: aID (PK), etc 
Table B: bID (PK), aID (FK), etc 
Table C: cID, aID (FK), bID (nullable FK), etc 

, 나는 C 행에서 참조되지 않은 모든 AB 행을 찾기 위해 노력하고있어.

저는 모든 것을 시도해 보았습니다. 그 중에서도 특히 조인은 좋았지 만,별로 좋지 않았습니다. 나는 또한 어떤 종류의 JOIN ON x AND y을 심사숙고했다. 그러나 그것이 무엇인지에 대해서는 분명하지 않고 문서도 부족하다.

E.G.

표 A

aID 
1 
2 
3 

표 B는

bID  aID 
1  1 
2  1 
3  2 

표 C는

cID aID bID 
1 1 NULL 
2 1 1 
3 2 NULL 

쿼리 돌려

aID bID 
1 2 
2 3 
3 NULL 
+1

오른쪽 조인을 볼 때마다 왼쪽으로 다시 쓸 수 있습니다. FROM 절에서 테이블의 순서를 전환하기 만하면됩니다. – gvee

+0

또한 요청을 명확히하는 데 도움이되는 몇 가지 샘플 데이터와 원하는 결과를 확인하는 것이 좋습니다. – gvee

+0

정확히 무엇이 필요한지에 따라 여러 가지 방법이 있습니다. 쿼리에서 생성해야하는 샘플 데이터와 예상되는 결과를 추가 할 수 있습니까? – Mureinik

답변

1

당신의 택시는 다음과 같이 그것을 :

SELECT A.aID, B.bID 
FROM A 
LEFT OUTER JOIN B ON A.aID=B.aID -- We are not guaranteed to have B for each A 
LEFT OUTER JOIN C ON C.aID=A.aID AND (C.bID IS NULL OR C.bID=B.bID) 
WHERE C.cID IS NULL 

참고 : 편집을 코멘트에 반응.

+0

사실, 우리는 모든 A에 대해 B를 가질 것이라는 보장이 없기 때문에 A 행이 존재하는지 여부에 대해 어둠에 빠지게됩니다. – pulverize

+0

@pulverize 나는 그것을 몰랐다. 편집을 한번보세요. – dasblinkenlight

3

C 행에서 참조되지 않은 모든 A 및 B 행을 찾으려고합니다.

당신은 NOT EXISTS을 사용할 수 있습니다 : 그것은 조인 컬럼에 널 (null) 값으로 아무 문제가 없기 때문에

SELECT A.aID, B.bID 
FROM A INNER JOIN B 
    ON A.aID = B.aID 
WHERE NOT EXISTS 
(
    SELECT 1 FROM C 
    WHERE A.aID = C.aID OR B.bID = C.bID 
) 

Not Exists이 선호하는 방법입니다. Read.

: A-행은 B-행을 가지고 있지만 (다른 대답에 코멘트에서 언급 한 바와 같이) 당신은 어쨌든 A-행을보고 싶어 매일하지 않으면


, 당신은 Outer Join을 사용해야합니다

SELECT A.aID, B.bID 
FROM A LEFT OUTER JOIN B 
    ON A.aID = B.aID 
WHERE NOT EXISTS ... (rest same) 
관련 문제