我有两张桌子。全球渔业数据(捕获和水产养殖)。我想通过模拟MySQL中的完全外部连接来进行合并。
Tbl_A捕获
Tbl_B -水产养殖
这一问题由于以下因素而变得复杂:
Tbl_A捕获
cap_id| yr_c| sp_c| iso_c| area_c| qty_c
3| 2015| TRR| 54| 8| 120
678| 2015| BOM| 62| 27| 0.0
20| 2015| TRR| 54| 27| 0.0
45| 2015| FRC| 7| 15| 86800Tbl_B -水产养殖
cap_id| yr_a| sp_a| iso_a| area_a| qty_a
78| 2015| OTS| 32| 27| 6868
333| 2015| FRC| 7| 15| 550
789| 2015| TRR| 54| 27| 45000
987| 2015| TRR| 32| 27| 40在选定的一年(2015年)中,我试图捕捉到:
Tbl_C -期望最终的Tbl
id| cap_id| aqua_id| yr_c| yr_a| sp_c| sp_a| iso_c| iso_a|area_c|area_a| qty_c| qty_a
1 | 20| 789| 2015| 2015| TRR| TRR| 54| 54| 27| 27| 0.0| 45000
2 | 45| 333| 2015| 2015| FRC| FRC| 7| 7| 15| 15| 86800| 550
3 | 678| NULL| 2015| NULL| BOM| NULL| 62| NULL| 27| NULL| 0.0| NULL
4 | 3| NULL| 2015| NULL| TRR| NULL| 54| NULL| 8| NULL| 120| NULL
5 | NULL| 78| NULL| 2015| NULL| OTS| NULL| 32| NULL| 27| NULL| 6868
6 | NULL| 987| NULL| 2015| NULL| TRR| NULL| 32| NULL| 27| NULL| 40我有一个使用UNION连接两个左联接的查询:
(SELECT
c.capture_id,
a.aqua_id,
c.year_c,
a.year_a,
c.species_c,
a.species_a,
c.iso_code_c,
a.iso_code_a,
c.area_c,
a.area_a,
c.environ_code_c,
a.environ_code_a,
c.qty_taken,
a.qty_prod
FROM capture AS c
LEFT JOIN aquaculture AS a
ON c.year_c = a.year_a AND c.iso_code_c = a.iso_code_a AND c.area_c = a.area_a AND c.species_c =
a.species_a
WHERE c.year_c = 2015 AND a.year_a = 2015)
UNION
(SELECT
c.capture_id,
a.aqua_id,
c.year_c,
a.year_a,
c.species_c,
a.species_a,
c.iso_code_c,
a.iso_code_a,
c.area_c,
a.area_a,
c.qty_taken,
a.qty_prod
FROM aquaculture AS a
LEFT JOIN capture AS c
ON c.year_c = a.year_a AND c.iso_code_c = a.iso_code_a AND c.area_c = a.area_a AND c.species_c = a.species_a
WHERE a.year_a = 2015 AND c.year_c = 2015);但是上面的查询只返回一组匹配的记录。
id| cap_id| aqua_id| yr_c| yr_a| sp_c| sp_a| iso_c| iso_a|area_c|area_a| qty_c| qty_a
1 | 20| 789| 2015| 2015| TRR| TRR| 54| 54| 27| 27| 0.0| 45000
2 | 45| 333| 2015| 2015| FRC| FRC| 7| 7| 15| 15| 86800| 550我不明白我是如何取消左联接的效果的。
发布于 2017-09-08 20:36:52
你的问题在WHERE条款中。您正在排除“右”表记录为空的记录。
SELECT *
FROM c LEFT JOIN a ON ...
WHERE c.year = 2015 /*remove AND a.year = 2015*/
UNION SELECT *
FROM a LEFT JOIN c ON ...
WHERE a.year = 2015 /*remove AND c.year = 2015*/发布于 2017-09-06 22:46:58
由于MySQL只支持左、右和内连接--您需要编写两个查询: 1)表A左连接表B)表B左连接表A,然后在友联市的帮助下将它们组合成一个结果。Union还将删除结果中重复的行,因此结果集中只有3种类型的行:
尝试:
SELECT ...
FROM c
LEFT JOIN a ON ...
UNION
SELECT ...
FROM a
LEFT JOIN c ON ...https://stackoverflow.com/questions/46085116
复制相似问题