【发布时间】:2023-03-27 21:34:01
【问题描述】:
我有两张桌子。全球捕鱼数据(捕捞和水产养殖)。我想通过在 MySQL 中模拟 FULL OUTER JOIN 来组合。
Tbl_A - 捕获
- capture_id
- year_c
- species_c
- iso_code_c
- area_code_c
- environ_code_c
- qty_taken
- value_c
- symbol_c
Tbl_B - 水产养殖
- aqua_id
- year_a
- species_a
- iso_code_a
- area_code_a
- environ_code_a
- qty_prod
- value_aqua
- symbol_a
这很复杂:
- Tbl_A 和 Tbl_B 不相关
- 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| 86800
Tbl_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_A 和 Tbl_B 记录(物种、iso_code、区域)相同的地方;
- 没有 Tbl_B 匹配的 Tbl_A 记录(物种、iso_code、区域);和
- 没有 Tbl_A 匹配的 Tbl_B 记录(物种、iso_code、区域)。
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
我不明白我是如何取消 LEFT JOINS 的效果的
【问题讨论】:
-
这很难说,但是您是否尝试执行
FULL OUTER JOIN,如果任一输入表包含该行,则结果包含该行? -
我发现这里的这个教程很有帮助:blog.codinghorror.com/a-visual-explanation-of-sql-joins
-
呃,当我的强迫症发作时,我讨厌它。那些波浪形的桌子!
-
join_id = 10错误,它缺少一列。应该是a_id = NULL?
标签: mysql constraints left-join full-outer-join