2013-07-08 1 views
-2
select table3.tid, table3.name, talble4.name1, table4.name2 from table3 left join 
(select table1.tid, table1.name as name1, table2.name as name2 from table1 left join table2 
on table1.tid = table2.tid 
union 
select table2.tid, table1.name, table2.name from table1 right join table2 
on table1.tid = table2.tid) as table4; 

무엇이 잘못되었는지 알려주세요. 바깥 쪽 여러 테이블 조인

나는 완전 외부 3 개 테이블의 조인합니다 : 표 1, 표 2 및 표 3 (MYSQL 지원하지 않는이)

+0

어디 테이블 구조는 무엇입니까? –

+0

왜 이렇게하지 않는지 http://stackoverflow.com/questions/4796872/full-outer-join-in-mysql – Jonesopolis

+0

실제 테이블 이름을 입력하십시오. table1, table2, table3은 읽기가 어렵습니다. –

답변

0

안녕 당신이하지 않는 것 "table3.JoinColumn = table4.JoinColumn의" 귀하의 SQL에 table4 후. 나는 당신이 당신의 실수가 무엇인지 말하지 않았을 때 당신이 표시되어있는 것 같아요. 나는 당신의 질문이 다소 모호하다고 생각합니다. 하지만 아마도 내가 준 SQL은 작업을 완료하는 데 필요한 모든 것일 수 있습니다.

1

UNION ALL 연산과 함께 연결된 행과 함께 세 개의 별도 쿼리를 사용하여 세 개의 테이블을 "전체 외부 조인"을 에뮬레이트합니다 .

첫 번째 쿼리는 모두 table1의 tid 값입니다. 두 번째 쿼리는 table2에있는 모든 tid 값을 table1에 없습니다. 세 번째 쿼리는 table1에 없으며 table2에없는 table3의 모든 tid 값을 가져옵니다. 두 번째와 세 번째 질의에 "트릭"는 tid 값이 생략 이전 쿼리에서 반환 확인하기 위해, WHERE 절에 적절한

tid IS NULL 

술어를 포함한다. (만약 우리가 tid이 NOT NULL이 아니라는 것을 보장하지 않는다면, "구동"테이블에 대한 각각의 쿼리에 적절한 tid IS NOT NULL 술어를 포함함으로써 tid에 대한 NULL 값을 반환하는 것을 피하고자 할 것입니다. 아래의 예제는 테이블입니다 FROM 키워드 다음에)

마지막 단계는 선택 목록에 name 열을 포함시키는 것입니다. 일관성을 위해 table1의 이름 값을 같은 열에 넣었습니다. (제 쿼리에서 NAME1 열은 항상 제 쿼리에서 NAME1 NAME2 및 열은 항상 NULL 것, NULL이 될 것이다.)

SELECT a.tid 
    , a.name AS name1 
    , b.name AS name2 
    , c.name AS name3 
    FROM table1 a 
    LEFT 
    JOIN table2 b ON b.tid = a.tid 
    LEFT 
    JOIN table3 c ON c.tid = a.tid 
UNION ALL 
SELECT d.tid 
    , f.name AS name1 
    , d.name AS name2 
    , e.name AS name3 
    FROM table2 d 
    LEFT 
    JOIN table3 e ON e.tid = d.tid 
    LEFT 
    JOIN table1 f ON f.tid = d.tid 
WHERE f.tid IS NULL 
UNION ALL 
SELECT g.tid 
    , h.name AS name1 
    , i.name AS name2 
    , g.name AS name3 
    FROM table3 g 
    LEFT 
    JOIN table1 h ON h.tid = g.tid 
    LEFT 
    JOIN table2 i ON i.tid = g.tid 
WHERE h.tid IS NULL 
    AND i.tid IS NULL