2012-05-22 1 views
1

I가 많은 -2- 많은 관계 2 개 테이블이 가득 많은 -2- 많은 매트릭스를 작성 :
TABLEA (IDA 발라)
TableB의 (IDB, valB)를
tableAB (IDA, IDB) 여기

몇 가지 입력/출력 예이다 (관련 아닌지 IDA, IDB, 0/1)
:

는 I마다 tupple에 반환해야 하나의 질의가 필요 TABLEA

ida valA 
1  b 
2  s 
3  l 

TableB의

idb valB 
11 aaa 
22 bbb 
33 ccc 

tableAB

ida idb 
1  11 
2  33 

예상 결과 : 나는 아칸소 순열을 필요가 없습니다

ida  idb  is_exists 
1  11  1 
2  11  0 
1  33  0 
2  33  1 

주 e 항상 0, 예를 들어 ida = 3 또는 idb = 22
행렬 전체가 0 인 것을 의미하기 때문입니다 (이는 행이 다른 테이블과 아무 관계가 없음을 나타냄)

\ ida |  |  | 
idb \ | 1 | 2 | 3 
--------------------------- 
11  | 1 | 0 | 0 
--------------------------- 
22  | 0 | 0 | 0 
--------------------------- 
33  | 0 | 1 | 0 

답변

3

필요한 모든 쌍을 가진 운전대가 필요합니다. 이 얻을 수있는 한 가지 방법은 크로스 조인을 사용하여 TableA의 및 TableB의에서입니다 :

select allAB.aid, allAB.bid, max(case when ab.aid is not null then 1 else 0 end) as HasPair 
from (select distinct a.id as aid, b.id as bid 
     from TableA a cross join 
      TableB b 
    ) as allAB left outer join 
    TableAB ab 
    on allAB.aid = ab.aid and 
     allAB.bid = ab.bid 
group by allAB.aid, allAB.bid 

그 후, 쿼리는 요약하고 TableAB에 일치하는 레코드가 있는지 여부를 결정합니다.

+0

왜'max' 응용 프로그램이'case' 문 주위에 필요합니까? – gcbenison

+0

ab.id는 group by 절에 포함되어 있지 않으므로 이것은 한 쌍당 한 행을 생성합니다. –

+0

이것은 관계가없는 레코드도 제공합니다 (내 질문에있는 참고 참조). 어쨌든 내가 allAB를 십자가 조인으로 만들면 (한 번 뚜렷한 ida를 선택하고 두 번째 유일한 idb를 선택하는 것) 그것은 훌륭하게 작동합니다! – Bassal