2012-04-13 77 views
1

我有兩個表payroll_advancepayroll_advrtn,我應該做完整的外部聯接以獲得我的要求結果。但是,我確信完整的外部聯接在mysql中是不可能的,而且我知道完全外部連接是可能的通過使用union.But我不知道我怎麼能加入在下面的查詢。如何在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 | 
+------+-------+-------+------------+----------+---------+ 

任何幫助將不勝感激。謝謝!

+1

你的結果母鹿這看起來不像是一個完全聯結。 – 2012-04-13 08:29:41

+0

@ypercube:是的,它看起來沒什麼特別之處,但我認爲歐普可能在產生取消結果時犯了一些錯誤。我提供了一個給出「完整外部聯接」結果的答案。 – Anonymous 2012-04-13 08:33:02

回答

3

爲了做FULL OUTER JOINyou can doLEFT OUTER JOINUNIONRIGHT OUTER JOIN 提供 MySql依然不支持 FULL OUTER JOIN ):

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 

注意,您可以使用子查詢爲AB - 這應該與您的查詢一起工作。你的情況:

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 

有了結果等於(前提是我沒有我在複製粘貼你的數據有誤):

+------+-------+------------+----------+------+-------+------------+----------+ 
| _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

感謝您的回答。但是,如何過濾日期約束的結果,即只顯示當前月份的數據。 – 2012-04-13 09:18:18

+0

例如,在WHERE子句中爲查詢添加日期限制(例如'BETWEEN')。 – Anonymous 2012-04-13 09:30:50

+0

當我試圖給字段列表而不是'*'爲上述給定的查詢我收到以下錯誤「#1052 - 列」字段列表中的我的列名稱「不明確」。我可以選擇領域? – 2012-04-13 09:41:44

0

商店這樣既查詢的結果:

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

這是錯誤的答案。我想你還沒有測試過它。它不會工作,因爲結果將是:'錯誤1137(HY000):無法重新打開表:'a''。表a將被鎖定。 – Joe 2012-06-12 08:50:31