2013-03-30 3 views
1

다양한 예제를 보았습니다 만 table_A에서 행과 관련이없는 모든 행을 table_B에 반환하는 방법에 대한 확실한 예를 찾을 수 없습니다. table_A_B 주어진 값은 table_A.id 또는 table_B.id입니다. 나는이에 찾을 수있는 가장 가까운 matchs은 다음과 같습니다 관련 테이블의 관계없는 ID를 선택하십시오

  1. A의 목록이 아닙니다 B에 있지만, 문제가 B에있는 값 모른 채 하나 이상의 행에 관련된를 가져옵니다.

  2. B과 관련없는 A의 목록을 받으세요.

  3. B의 쉼표로 구분 된 필드가있는 A의 목록을 가져옵니다. (확실하지는 않지만 한 가지 예처럼 확장 될 수 있습니다.)

  4. AB의 목록은 서로 관련이 없지만 다른 것과 관련이 없다는 표시는 없습니다.

나는 또한 모든 잠재적 인 A_B 튜플의 목록을 얻을 수 있습니다 :

SELECT A.id, B.id FROM A 
INNER JOIN B ON A.id <> B.id 

을 그리고 가정적 관련 테이블에 대해 EXCEPT 해결 방법 (내 생각) 중 하나를 사용할 수 있지만 모든 시도가 있었다 성공하지 못했고 그 조합에 의해 반환 된 수백만 개의 잠재적 인 조합이 있다면 어쨌든 훨씬 효율적이지 않을 것이라고 생각합니다.

그래서 주어진 테이블 값 :

A 
id | name 
1 | X 
2 | y 
3 | z 


B 
id | name 
7 | e 
8 | f 
9 | g 

A_B 
id | a_id | b_id 
1 | 1 | 7 
2 | 1 | 8 
3 | 1 | 9 
1 | 2 | 7 
2 | 2 | 8 
1 | 3 | 7 

반환하는 쿼리가 있습니까 : A가 | B 2 | 9 3 | 8 3 | 9

또는 더 나은 :

A | B 
y | g 
z | f 
z | g 

또는

이 문제에 대한 요구하고있다?

답변

3

가능한 모든 쌍을 얻기 위해 A와 B 사이의 교차 결합으로 시작하십시오. 그런 다음 왼쪽의 관계 테이블에 가입하고 일치가없는 경우 선택합니까 :

select driver.aID, driver.bID 
from (select a.id as aID, b.id as bID 
     from table_A A cross join table_B B 
    ) driver left outer join 
    table_A_B ab 
    on ab.aID = driver.aID and ab.bID = bID 
where ab.aID is null 

이이 ID를 NULL 결코 가정, 작동합니다.

SQL을 테스트하지 않았으므로 구문 오류가있을 수 있습니다.

이 버전은 당신에게 이름을 가져옵니다

select driver.aName, driver.bName 
from (select a.id as aID, b.id as bID, a.name as aName, b.name as Bname 
     from table_A A cross join table_B B 
    ) driver left outer join 
    table_A_B ab 
    on ab.aID = driver.aID and ab.bID = bID 
where ab.aID is null 
+0

내가 사용하는 시도 'INNER이 잠재력의 전체 목록을 얻을 수 A.id <> B.id' 가입하지만 굽이마다 실패했다. 다행스럽게도 나는 논리적으로 올바른 아이디어를 가지고 있었고 집에 가져갈 수있는 방법을 알고있었습니다. 감사! – Anthony

관련 문제