2012-04-13 8 views
1

Ich habe zwei Tabellen payroll_advance und payroll_advrtn, und ich soll voll Außen trete meine erfordern result.But zu bekommen, ich bin sicher, dass vollständige äußere Verknüpfung in mysql nicht möglich ist, und ich weiß auch, dass die vollständige Außen Join ist möglich, indem Sie die Union verwenden. Aber ich weiß nicht, wie ich bei der folgenden Abfrage beitreten kann.Wie macht man den vollständigen äußeren Join, um zwei Tabellen in mysql zu kombinieren?

Meine payroll_advance Tabelle das folgende Ergebnis.

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

Und Payroll_advrtn gibt das folgende Ergebnis.

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

Aber ich möchte etwas wie das folgende Ergebnis durch die Kombination der beiden oben genannten Ergebnisse.

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

Jede Hilfe wird geschätzt. Danke!

+1

Ihr Ergebnis doe Es sieht nicht wie ein FULL JOIN aus. –

+0

@ypercube: Ja, es sieht nicht wie etwas speziell aus, aber ich nehme an, dass Op möglicherweise einige Fehler gemacht hat, während er das deisred Ergebnis produziert hat. Ich gab eine Antwort mit den Ergebnissen "FULL OUTER JOIN". – Anonymous

Antwort

3

Um die FULL OUTER JOINyou can do die LEFT OUTER JOIN und UNION mit RIGHT OUTER JOIN ( vorausgesetzt, dass MySql noch nicht FULL OUTER JOIN nicht unterstützt) zu tun:

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 

Beachten Sie, dass Unterabfragen für A und B verwenden können - was sollte arbeite mit deinen Anfragen. In Ihrem Fall:

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 

mit gleich sein (vorausgesetzt, dass ich nicht mein ein Fehler in Kopie-Einfügen haben Sie Ihre Daten):

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

Vielen Dank für Ihre Antwort. Aber, wie kann ich das Ergebnis nach Datum Einschränkung filtern, d. H. Nur die Daten des aktuellen Monats anzeigen. –

+0

Fügen Sie beispielsweise eine Datumsbeschränkung (z. B. "BETWEEN") zu den Abfragen in einer WHERE-Klausel hinzu. – Anonymous

+0

Wenn ich versuche, die Feldliste anstelle von '*' für die oben angegebene Abfrage zu geben, bekomme ich den folgenden Fehler "# 1052 - Spalte 'mein Spaltenname' in der Feldliste ist mehrdeutig" .Kann ich das ausgewählte erhalten Feld? –

0

Shop die Ergebnisse der beiden Abfragen wie folgt:

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

Dann:

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

Es ist eine falsche Antwort. Ich schätze, du hast es nicht getestet. Es wird nicht funktionieren, weil das Ergebnis sein wird: 'ERROR 1137 (HY000): Kann Tabelle nicht wieder öffnen: 'a''. Tabelle a wird gesperrt. – Joe