首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL中模拟完全外部联接时如何正确组合多个WHERE语句和多个ON子句

在MySQL中模拟完全外部联接时如何正确组合多个WHERE语句和多个ON子句
EN

Stack Overflow用户
提问于 2017-09-06 22:18:17
回答 2查看 237关注 0票数 2

我有两张桌子。全球渔业数据(捕获和水产养殖)。我想通过模拟MySQL中的完全外部连接来进行合并。

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捕获

代码语言:javascript
复制
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 -水产养殖

代码语言:javascript
复制
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年)中,我试图捕捉到:

  1. Tbl_A & Tbl_B记录(物种、iso_code、面积)相同;
  2. Tbl_A记录(物种,iso_code,面积)没有Tbl_B匹配;
  3. Tbl_B记录(物种,iso_code,面积)没有Tbl_A匹配。

Tbl_C -期望最终的Tbl

代码语言:javascript
复制
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连接两个左联接的查询:

代码语言:javascript
复制
(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);

但是上面的查询只返回一组匹配的记录。

代码语言:javascript
复制
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

我不明白我是如何取消左联接的效果的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-08 20:36:52

你的问题在WHERE条款中。您正在排除“右”表记录为空的记录。

代码语言:javascript
复制
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*/
票数 1
EN

Stack Overflow用户

发布于 2017-09-06 22:46:58

由于MySQL只支持左、右和内连接--您需要编写两个查询: 1)表A左连接表B)表B左连接表A,然后在友联市的帮助下将它们组合成一个结果。Union还将删除结果中重复的行,因此结果集中只有3种类型的行:

  1. 使用两个表中的数据行,即A内连接B
  2. 表A中的数据行,其中没有来自B的匹配,即A向左连接B。
  3. 使用表B中的数据行,其中A中没有匹配项,即B留下联接A

尝试:

代码语言:javascript
复制
SELECT ...
FROM c
LEFT JOIN a ON ...
UNION
SELECT ...
FROM a
LEFT JOIN c ON ...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46085116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档