MySQL 自完全外连接

MySQL Self Full Outer Join

我对 SQL 和 MySQL 非常菜鸟。我发现自连接是一种比较 "x" 的方法,其中 A 列相同,例如

选项卡 1:

id    colA    x
-----------------
1     q1      0.1
1     q2      0.5
1     q3      0.7
2     q1      0.4
2     q2      0.9
2     q3      1.3
3     q1      0.2
3     q2      0.4
3     q3      0.1    

查询:

select a.`colA`, a.`x`, b.`x`, c.`x`
from `tab1` as a
join `tab1` as b on a.`colA` = b.`colA`
join `tab1` as c on a.`colA` = c.`colA`
where a.`id` = 1 and b.`id` = 2 and c.`id` = 3

给我:

colA    x      x      x
q1      0.1    0.4    0.2
q2      0.5    0.9    0.4
q3      0.7    1.3    0.1

太棒了!我还刚刚发现 MySQL 无法进行完全外部连接,因此使用左连接、右连接或普通旧连接会给我 MINIMUM 行,即如果 id 缺少任何 colA 值,那么它们将完全结果中缺少,实际上,如果我在上面的任何 id 中去掉 q1 和 q2,我会得到一行。

q3      0.7    1.3    0.1

我已经看到了很多关于如何使用 UNION / UNION ALL 来模拟完整的外部连接的链接,我可以使用 frankenstein,但是这些并没有给我结果作为一个很好的比较 table。有没有一种更简单的方法可以在 SELF 连接期间告诉查询不要忽略空值?我觉得这应该很容易,但我已经抓了好几个小时的脑袋,用谷歌搜索了很多答案我认为我看不到树林,因为树太多了。

我会采取不同的方法;完全避免完全外连接和自连接。

我认为您想要的是在 mySQL 中模拟一个枢轴,这可以通过 case 语句和具有适当分组依据的聚合来完成。

演示:http://rextester.com/NGFNJG9485

SELECT ColA
     , max(Case when ID = 1 then x end) as x1
     , max(Case when ID = 2 then x end) as x2
     , max(Case when ID = 3 then x end) as x3
FROM tab1
GROUP BY colA

给我们:

+----+------+-----+-----+-----+
|    | ColA | x1  | x2  | x3  |
+----+------+-----+-----+-----+
|  1 | q1   | 0,1 | 0,4 | 0,2 |
|  2 | q2   | 0,5 | 0,9 | 0,4 |
|  3 | q3   | 0,7 | 1,3 | 0,1 |
+----+------+-----+-----+-----+

或者如果我们删除 ID 3 的数据点,colA 'q2':

+----+------+-----+-----+------+
|    | ColA | x1  | x2  |  x3  |
+----+------+-----+-----+------+
|  1 | q1   | 0,1 | 0,4 | 0,2  |
|  2 | q2   | 0,5 | 0,9 | NULL |
|  3 | q3   | 0,7 | 1,3 | 0,1  |
+----+------+-----+-----+------+

这假设

  • 您将添加更多 Q# 而不是更多 ID。换句话说,我们不需要添加更多列,因为 ID 始终为 1、2、3。如果您确实需要更多列 (Id),只需添加其他案例即可;或使用顶级评论 2nd link.
  • 中提到的动态 SQL
  • ID 和 colA 是唯一的。如果存在重复项,那么我们将需要讨论应该提供什么 x 值。平均?和?什么?否则,min/max/avg 都可以。

这会根据需要处理空值,因为只有空值的列的最大值为空值,我们还可以 coalesce() 结果显示 0(如果优先于空值)。例如:coalesce(max(Case when ID = 3 then x end),0) as x3

给我们:

+----+------+-----+-----+-----+
|    | ColA | x1  | x2  | x3  |
+----+------+-----+-----+-----+
|  1 | q1   | 0,1 | 0,4 | 0,2 |
|  2 | q2   | 0,5 | 0,9 | 0,0 |
|  3 | q3   | 0,7 | 1,3 | 0,1 |
+----+------+-----+-----+-----+