2012-04-13 1 views
1

내 필요 result.But를 얻기 위해 조인 나는 두 테이블 payroll_advancepayroll_advrtn을 가지고, 내가 완전 외부를 어떻게해야, 나는 완전 외부 MySQL은 가능하지 않다 가입 확신도 내가 완전 외부 알고 조인은 union을 사용하여 가능합니다. 그러나 다음 쿼리에서 어떻게 조인 할 수 있는지 모르겠습니다.mysql에서 두 테이블을 결합하기 위해 전체 외부 조인을 수행하는 방법은 무엇입니까?

payroll_advance 표는 다음과 같은 결과를 생성합니다.

SELECT _id,_tid,_dt,sum(_amount) as _advance FROM payroll_advance WHERE YEAR(_dt)=YEAR(CURDATE()) AND MONTH(_dt) = MONTH(CURDATE()) group by _tid; 

+-----+-------+------------+---------+ 
| _id | _tid | _dt  | _advance| 
+-----+-------+------------+---------+ 
| 17 | hjg | 2012-04-18 | 2151 | 
| 22 | RKT01 | 2012-04-10 | 2098 | 
| 14 | RKT04 | 2012-04-18 | 1511 | 
| 16 | RKT09 | 2012-04-09 |  250 | 
| 15 | RKT10 | 2012-04-17 | 1313 | 
| 8 | RKT21 | 2012-04-03 | 1321 | 
| 19 | RKT31 | 2012-04-26 | 2512 | 
| 20 | RKT33 | 2012-04-10 | 2250 | 
| 25 | T01 | 2012-04-11 | 2500 | 
+-----+-------+------------+---------+ 

그리고 payroll_advrtn은 다음 결과를 제공합니다.

SELECT _id,_tid,_dt,sum(_amount) as _advrtn FROM payroll_advrtn WHERE YEAR(_dt) = YEAR(CURDATE()) AND MONTH(_dt) = MONTH(CURDATE()) group by _tid; 
+-----+-------+------------+---------+ 
| _id | _tid | _dt  | _advrtn | 
+-----+-------+------------+---------+ 
| 9 | RKT02 | 2012-04-10 | 2500 | 
| 8 | RKT04 | 2012-04-20 |  150 | 
+-----+-------+------------+---------+ 

하지만 위의 두 결과를 결합하여 다음과 같은 결과를 원합니다.

+------+-------+-------+------------+----------+---------+ 
| _id | _tid | _tid | _dt  | _advance | _advrtn | 
+------+-------+-------+------------+----------+---------+ 
| 17 | hjg | NULL | 2012-04-18 |  2151 | NULL | 
| 22 | RKT01 | NULL | 2012-04-10 |  999 | NULL | 
| 14 | RKT04 | RKT04 | 2012-04-18 |  11 |  150 | 
| 16 | RKT09 | NULL | 2012-04-09 |  250 | NULL | 
| 15 | RKT10 | NULL | 2012-04-17 |  1313 | NULL | 
| 8 | RKT21 | NULL | 2012-04-03 |  1321 | NULL | 
| 19 | RKT31 | NULL | 2012-04-26 |  2512 | NULL | 
| 20 | RKT33 | NULL | 2012-04-10 |  2250 | NULL | 
| 25 | T01 | NULL | 2012-04-11 |  2500 | NULL | 
| NULL | NULL | RKT02 | NULL  |  NULL | 2500 | 
+------+-------+-------+------------+----------+---------+ 

감사합니다. 감사합니다. RIGHT OUTER JOINFULL OUTER JOINyou can doLEFT OUTER JOINUNION ( MySql 여전히 FULL OUTER JOIN 지원하지 않습니다 제공)을 수행하기 위해

+1

귀하의 결과 미상 FULL JOIN처럼 보이지 않습니다. –

+0

@ypercube : 그렇습니다. 특별히 보이지는 않지만, 결과가 나오지 않을 때 Op가 약간의 실수를했을 수도 있습니다. 나는'FULL OUTER JOIN' 결과를주는 답을주었습니다. – Anonymous

답변

3

: 당신이 AB에 대한 하위 쿼리를 사용할 수 있습니다

select * from A as a 
    left outer join B as b on a.col = b.col 
union 
select * from A as a 
    right outer join B as b on a.col = b.col 

주 -해야 귀하의 질의를 처리하십시오.

+------+-------+------------+----------+------+-------+------------+----------+ 
| _id | _tid | _dt  | _advance | _id | _tid | _dt  | _advartn | 
+------+-------+------------+----------+------+-------+------------+----------+ 
| 17 | hjg | 2012-04-18 |  2151 | NULL | NULL | NULL  |  NULL | 
| 22 | RKT01 | 2012-04-10 |  2098 | NULL | NULL | NULL  |  NULL | 
| 14 | RKT04 | 2012-04-18 |  1511 | 8 | RKT04 | 2012-04-20 |  150 | 
| 16 | RKT09 | 2012-04-09 |  250 | NULL | NULL | NULL  |  NULL | 
| 15 | RKT10 | 2012-04-17 |  1313 | NULL | NULL | NULL  |  NULL | 
| 8 | RKT21 | 2012-04-03 |  1321 | NULL | NULL | NULL  |  NULL | 
| 19 | RKT31 | 2012-04-26 |  2512 | NULL | NULL | NULL  |  NULL | 
| 20 | RKT33 | 2012-04-10 |  2250 | NULL | NULL | NULL  |  NULL | 
| 25 | T01 | 2012-04-11 |  2500 | NULL | NULL | NULL  |  NULL | 
| NULL | NULL | NULL  |  NULL | 9 | RKT02 | 2012-04-10 |  2500 | 
+------+-------+------------+----------+------+-------+------------+----------+ 
+0

답변 해 주셔서 감사합니다. 그러나 결과를 날짜 제약 조건으로 필터링 할 수 있습니다. 즉 현재 월 데이터 만 표시 할 수 있습니다. –

+0

예를 들어,'WHERE' 절의 쿼리에 날짜 제한 (예 :'BETWEEN')을 추가하십시오. – Anonymous

+0

내가 위의 주어진 쿼리에 대해 '*'대신에 필드 목록을 제공하려고 할 때 다음 오류가 발생합니다. "# 1052 - 열 '내 열 이름'필드 목록에서 모호합니다. 선택한 항목을 가져올 수 있습니까? 들? –

0

스토어 같은 두 쿼리의 결과 : 귀하의 경우 : 결과와 동일하게하여

select * from (SELECT * FROM t1) as a 
    left outer join (SELECT * FROM t2) as b on a._tid = b._tid 
union 
select * from (SELECT * FROM t1) as a 
    right outer join (SELECT * FROM t2) as b on a._tid = b._tid 

는 (I 복사 - 붙여 넣기 데이터 내 실수하지 않았다 제공) 그런 다음

create temporary table a as select ... ; 
create temporary table b as select ... ; 

:

select * from a left join b using (_tid) 
union 
select * from a right join b using (_tid); 
+0

대답이 잘못되었습니다. 나는 당신이 그것을 테스트하지 않은 것 같아요. 결과는 다음과 같으므로 작동하지 않습니다 :'ERROR 1137 (HY000) : 테이블을 다시 열 수 없습니다 : 'a''. 표 a가 잠길 것입니다. – Joe

관련 문제