2012-04-13 4 views
1

У меня есть две таблицы payroll_advance и payroll_advrtn, и я должен сделать полное внешнее объединение, чтобы получить мой требуется result.But, я уверен, что полное внешнее соединение не возможно в MySQL, а также я знаю, что полное внешнее соединение возможно с помощью union.But я не знаю, как я могу присоединиться к следующему запросу.Как выполнить полное внешнее соединение для объединения двух таблиц в mysql?

My 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

Ваш результат лань не похоже на ПОЛНОЕ ПРИСОЕДИНЕНИЕ. –

+0

@ypercube: Да, это не похоже на что-либо в частности, но я полагаю, что Op, возможно, допустил некоторые ошибки, производя деисусный результат. Я дал ответ, дающий результаты «FULL OUTER JOIN». – Anonymous

ответ

3

Для того, чтобы сделать то FULL OUTER JOINyou can doLEFT OUTER JOIN и UNION с RIGHT 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 

Обратите внимание, что вы можете использовать подзапросы для A и B - которые должны работайте со своими запросами. В вашем случае:

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

Спасибо за ваш ответ. Но как я могу отфильтровать результат по ограничению по дате, то есть отображать только данные текущего месяца. –

+0

Например, добавьте ограничение времени (например, 'BETWEEN') к запросам в предложении' WHERE'. – Anonymous

+0

Когда я пытаюсь предоставить список полей вместо «*» для вышеуказанного запроса, я получаю следующую ошибку «# 1052 - Столбец« мое имя столбца »в списке полей неоднозначно». Могу ли я получить выбранный поле? –

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

Это неправильный ответ. Думаю, вы его не протестировали. Это не сработает, потому что результатом будет: 'ERROR 1137 (HY000): не удается открыть таблицу: 'a''. Таблица a будет заблокирована. – Joe

 Смежные вопросы

  • Нет связанных вопросов^_^