2009-03-30 5 views
0

가 나는 세 개의 테이블여러 테이블을 어떻게 병합 (병합)합니까?

AUTHOR_TABLE 
------------- 
AUTHOR_ID (PK) AUTHOR_NAME 
1    me 
2    you 

ARTICLE_AUTHOR_TABLE 
------------- 
AUTHOR_ID ARTICLE_ID 
1   100 
2   101 


EVENT_AUTHOR_TABLE 
------------------------------------------ 
AUTHOR_ID EVENT_ID 
1   200 
1   201 

있어 내가 원하는 건 정말 안 중 하나

RESULTS 
----------------------------------------- 
AUTHOR_ID AUTHOR_NAME SOURCE_TABLE ID 
1   me   article  100 
2   you   article  101 
1   me   event  200 
1   me   event  201 

/* where SOURCE_TABLE would be either "EVENT" or "ARTICLE" */ 

편집이 인정이

RESULTS 
----------------------------------------- 
AUTHOR_ID AUTHOR_NAME EVENT_ID ARTICLE_ID 
1   me   NULL   100 
2   you   NULL   101 
1   me   200   NULL 
1   me   201   NULL 

모든 포인터를 원하는 것입니다.

덕분에이 이후

답변

3
SELECT 
    at.author_id, 
    at.author_name, 
    'article' AS source_table, 
    aat.id 
FROM 
    author_table at 
    JOIN article_author_table aat 
    ON at.author_id = aat.author_id 

UNION ALL 

SELECT 
    at.author_id, 
    at.author_name, 
    'event' AS source_table, 
    eat.id 
FROM 
    author_table at 
    JOIN event_author_table eat 
    ON at.author_id = eat.author_id 
+0

나는 실제로 이것과 함께 약 10 개의 테이블에 합류하기를 원한다. 그게 나쁜 생각인가? – inspite

+0

그것은 행의 양에 달려 있지만 ... 그렇습니다. 너무 많은 UNION을 갖는 것은 대개 나쁜 생각입니다. 주로 잘못 설계된 DB를 반영하기 때문에 가능하면 구조 조정이 바람직합니다. 그렇지 않다면 다시 처리 할 행 수에 따라 다릅니다. – Seb

+0

OK 고마워, 그래, 네가 10 년 전에 한 일이긴하지만 내가 임시 보고서를 작성하고 있기 때문에 나쁘지는 않다. D – inspite

1
SELECT A.AUTHOR_ID, A.AUTHOR_NAME, EA.EVENT_ID, AA.ARTICLE_ID 
FROM AUTHOR_TABLE AS A 
    LEFT JOIN ARTICLE_AUTHOR_TABLE AS AA ON AA.AUTHOR_ID = A.AUTHOR_ID 
    LEFT JOIN EVENT_AUTHOR_TALBE AS EA ON EA.AUTHOR_ID = A.AUTHOR_ID 
+0

이것은 그가 요구하는 것을 출력하지 않습니다 ... 그는 기사뿐만 아니라 동일한 결과 집합에 기사와 이벤트를 모두 표시하려고합니다. – Seb

+0

이제는 더 낫습니다. :) 그러나 원하는 첫 번째 결과를 가져 오는 방법이 있습니다. 내 대답 좀 봐. – Seb

0

숙제, 그리고 난 당신이 MySQL은, read this documentation on the UNION syntax를 사용하는 추측하고있다. 당신이하고있는 일은 기본적으로 유사한 데이터베이스에서 2 개 (또는 그 이상)의 쿼리를 수행하고 하나의 쿼리로 결과를 얻는 것입니다.

결과 열이 같아야합니다.

호출하는 테이블을 나타내는 변수를 만들 수도 있습니다.

SELECT AUTHOR_ID, AUTHOR_NAME, `AUTHOR_TABLE` AS SOURCE_TABLE, ID FROM AUTHOR_TABLE 

이렇게하면 모든 유니온이 변경되지만 테이블 이름은 변경됩니다.

+0

Btw는 숙제이기 때문에 Seb처럼 완전한 대답을하지 않기로 결정했습니다. –

+0

BTW 숙제가 아니므로 숙제처럼 단순화했습니다. D – inspite

+0

대답했을 때 숙제로 표시되지 않았습니다. 사람들이 다른 사람들의 질문에 숙제로 붙이는 것이 단순 해 보였기 때문에 싫습니다. – Seb

관련 문제