2012-04-13 81 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