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